臨時(shí)工找工作網(wǎng)站做美縫成都網(wǎng)站優(yōu)化排名
前言:
💞💞大家好,我是書(shū)生?,本階段和大家一起分享和探索數(shù)據(jù)分析,本篇文章主要講述了:Pandas進(jìn)階指南:核心計(jì)算方法、缺失值處理及數(shù)據(jù)類(lèi)型管理等等。歡迎大家一起探索討論!!!
💞💞代碼是你的畫(huà)筆,創(chuàng)新是你的畫(huà)布,用它們繪出屬于你的精彩世界,不斷挑戰(zhàn),無(wú)限可能!
個(gè)人主頁(yè)?: 書(shū)生?
gitee主頁(yè)🙋?♂:閑客
專(zhuān)欄主頁(yè)💞:大數(shù)據(jù)開(kāi)發(fā)
博客領(lǐng)域💥:大數(shù)據(jù)開(kāi)發(fā),java編程,前端,算法,Python
寫(xiě)作風(fēng)格💞:超前知識(shí)點(diǎn),干貨,思路講解,通俗易懂
支持博主💖:關(guān)注?,點(diǎn)贊、收藏?、留言💬
目錄
- 1. Pandas 計(jì)算方式
- 1.1 排序函數(shù)
- 1.1.1 nlargest和nsmallest函數(shù)
- 1.1.2 sort_values函數(shù)
- 1.2 聚合函數(shù)
- 1.2.1 min最小值
- 1.2.2 mean 平均值
- 1.2.3 sum 求和
- 1.2.4 count 計(jì)數(shù)
- 1.2.5 std函數(shù)計(jì)算標(biāo)準(zhǔn)偏差
- 1.2.6 median:中位數(shù)
- 1.2.7 cumsum 累計(jì)求和
- 1.2.8 quantile函數(shù)計(jì)算分位數(shù)
- 1.2.9 describe() 統(tǒng)計(jì)描述
- 1.2.10 corr 相關(guān)系數(shù)
- 1.3 Pandas函數(shù)小結(jié)
- 2. Pandas 缺失值
- 2.1 Pandas缺失值的特點(diǎn)
- 2.2 加載包含缺失的數(shù)據(jù)
- 2.3 查看缺失值
- 2.3.1 info查看缺失值個(gè)數(shù)
- 2.3.2 判斷數(shù)據(jù)值是否是缺失值
- 2.2.3 統(tǒng)計(jì)缺失值個(gè)數(shù)
- 2.4 Missingno庫(kù)對(duì)缺失值的情況進(jìn)行可視化探查
- 2.4.1 missingno.bar(df)缺失值數(shù)量可視化
- 2.4.2 missingno.matrix(df)缺失值位置的可視化
- 2.4.3 missingno.heatmap(df)缺失值之間相關(guān)性可視化
- 3. 缺失值處理
- 3.1 dropna刪除缺失值
- 3.2 填充缺失值
- 3.2.1 常數(shù)值填充
- 3.2.2 fillna前后值填充缺失值
- 3.2.3 interpolate線(xiàn)性插值
- 3.3 缺失值處理小結(jié)
- 4. Pandas數(shù)據(jù)類(lèi)型
- 4.1 Pandas 的數(shù)據(jù)結(jié)構(gòu)
- 4.2 查看數(shù)據(jù)類(lèi)型
- 4.3 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
- 4.3.1 seriers.astype函數(shù)轉(zhuǎn)換數(shù)據(jù)類(lèi)型
- 4.3.2 pd.to_numeric函數(shù)字符串轉(zhuǎn)數(shù)字類(lèi)型
- 4.4 category 分類(lèi)類(lèi)型
- 4.4.1 創(chuàng)建 category 分類(lèi)類(lèi)型
- 4.4.2 category 分類(lèi)類(lèi)型轉(zhuǎn)換
- 4.5 datetime時(shí)間類(lèi)型
- 4.5.1 查看數(shù)據(jù)時(shí)間
- 4.5.2 創(chuàng)建日期時(shí)間
- 4.5.3 時(shí)間戳
- 4.5.4 時(shí)間函數(shù)格式化
- 4.5.5 日期類(lèi)型的轉(zhuǎn)換
- 4.6 提取日期類(lèi)型的部分時(shí)間
- 注意事項(xiàng)
- 4.7 日期類(lèi)型運(yùn)算
- 4.8 日期類(lèi)型列作為索引
- 4.8.1 df.set_index(keys='列名') 設(shè)置索引
- 4.8.2 加載數(shù)據(jù)的時(shí)候指定索引
- 4.8.3 日期類(lèi)型索引獲取部分?jǐn)?shù)據(jù)
- 5. timedelta時(shí)間差類(lèi)型
- 5.1 timedelta時(shí)間差類(lèi)型 介紹
- 5.2 時(shí)間差類(lèi)型運(yùn)算
- 5.3 pd.to_timedelta函數(shù)轉(zhuǎn)換timedelta類(lèi)型
- 5.4 timedelta類(lèi)型數(shù)據(jù)作為df索引
- 6. Pandas 數(shù)據(jù)類(lèi)型的小結(jié)
- 6.1 Pandas中的數(shù)據(jù)類(lèi)型
- 6.2 Pandas中數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類(lèi)型的關(guān)系
- 6.3 Pandas數(shù)據(jù)類(lèi)型轉(zhuǎn)換基本方法
- 6.4 category分類(lèi)類(lèi)型
- 6.5 datetime時(shí)間類(lèi)型
- 6.6 timedelta時(shí)間差類(lèi)型
1. Pandas 計(jì)算方式
Pandas 是一個(gè)強(qiáng)大的 Python 數(shù)據(jù)分析庫(kù),提供了許多用于數(shù)據(jù)處理和分析的高效函數(shù)。以下是一些常用的計(jì)算函數(shù):
基本統(tǒng)計(jì)函數(shù)
mean()
: 計(jì)算平均值。median()
: 計(jì)算中位數(shù)。sum()
: 計(jì)算總和。min()
,max()
: 分別計(jì)算最小值和最大值。std()
,var()
: 計(jì)算標(biāo)準(zhǔn)差和方差。quantile()
: 計(jì)算分位數(shù)。
描述性統(tǒng)計(jì)
describe()
: 返回描述性統(tǒng)計(jì)信息,包括計(jì)數(shù)、平均值、標(biāo)準(zhǔn)差、最小值、四分位數(shù)和最大值等。
排序
sort_values()
: 按值排序。sort_index()
: 按索引排序。
聚合與分組
groupby()
: 對(duì)數(shù)據(jù)進(jìn)行分組操作,之后可以應(yīng)用其他聚合函數(shù)如sum()
,mean()
等。agg()
: 應(yīng)用多個(gè)聚合函數(shù)到不同的列上。
索引和切片
iloc[]
: 通過(guò)位置索引選擇數(shù)據(jù)。loc[]
: 通過(guò)標(biāo)簽索引選擇數(shù)據(jù)。
數(shù)據(jù)轉(zhuǎn)換
apply()
: 應(yīng)用自定義函數(shù)到每一行或每一列。map()
: 應(yīng)用于 Series 中的元素,通常用于替換值。replace()
: 替換 DataFrame 或 Series 中的值。
缺失值處理
isnull()
: 判斷值是否為空。notnull()
: 判斷值是否非空。dropna()
: 刪除缺失值。fillna()
: 填充缺失值。
1.1 排序函數(shù)
1.1.1 nlargest和nsmallest函數(shù)
nlargest(n=, columns=[列名1, 列名2, ...]): 實(shí)現(xiàn)對(duì)指定列的值由大到小排序, 返回前n行數(shù)據(jù)
nsmallest(n=, columns=[列名1, 列名2, ...]): 實(shí)現(xiàn)對(duì)指定列的值由小到大排序, 返回前n行數(shù)據(jù)
、n: 整數(shù), n行數(shù)據(jù), 默認(rèn)為5
列名: 指定排序的列名
第一個(gè)列有一樣的再根據(jù)在下一個(gè)列排序
加載數(shù)據(jù):
import pandas as pd
import numpy as np
# 加載數(shù)據(jù)集
df = pd.read_csv('../data/LJdata.csv')
df2 = df.head(10)
df2
- 對(duì)列值進(jìn)行降序后取前n個(gè)
# 按面積和價(jià)格排序,取前5個(gè)
df2.nlargest(n=5, columns=['面積', '價(jià)格'])
- 對(duì)列值進(jìn)行升序后取前n個(gè)
# 按面積和價(jià)格排序,取后5個(gè)
# #keep 默認(rèn)為first ,值相同時(shí)誰(shuí)在前,索引小的在前面
df2.nsmallest(n=5, columns=['面積', '價(jià)格'])
1.1.2 sort_values函數(shù)
通過(guò)
df.sort_values(by=列名列表, ascending=)
方法根據(jù)指定列指定排序方式排序
ascending: True或False, 默認(rèn)True->升序, 也可以接收布爾值列表, 每列指定排序方式
等同于 order by 列名 排序方式
- 升序
# 對(duì)價(jià)格列進(jìn)行升序排列
df2.sort_values(by='價(jià)格', ascending=True)
- 降序
如果前面有多個(gè)列名,但是只有一個(gè)TRUE或者FALSE那么全部列都按照這個(gè)排序,ascending也可以跟排序列表scending=[False,True] 第一個(gè)列按照降序,第一個(gè)相同的時(shí)候在第二個(gè)按照升序排序
# 對(duì)價(jià)格和面積列進(jìn)行降序排列
df2.sort_values(by=['價(jià)格','面積'], ascending=False)
df2.sort_values(by=['價(jià)格','面積'], ascending=[False,True])
- 索引值排序
# 索引值排序
print(df2.sort_index(ascending=True).head(5))
df2.sort_index(ascending=False).head(5)
1.2 聚合函數(shù)
常用聚合函數(shù)有:不統(tǒng)計(jì)NAN值
- corr 相關(guān)性
- min 最小值
- max 最大值
- mean 平均值
- std 標(biāo)準(zhǔn)偏差
- quantile 分位數(shù)
- sum 求和
1.2.1 min最小值
df.min()
對(duì)每一列求最小值,會(huì)返回df中每一列的最小值構(gòu)成的Series
df['列名'].min()
對(duì)某一列求最小值
# min 最小值 # 對(duì)某一列求最小值
print(df2['價(jià)格'].min())
# 對(duì)每一列求最小值
df2.min()
1.2.2 mean 平均值
df.mean()
對(duì)每一列求平均值
df['列名'].mean()
對(duì)某一列求平均值
mean函數(shù)計(jì)算平均值,用法和min函數(shù)的用法一致,但只會(huì)對(duì)數(shù)值類(lèi)型的數(shù)據(jù)進(jìn)行計(jì)算
只對(duì)數(shù)值列有效
# mean 平均值,只對(duì)數(shù)值列有效
df2.mean()
1.2.3 sum 求和
df.sum()
對(duì)每一列求求和
df['列名'].sum()
對(duì)某一列求求和
# sum 求和
# 對(duì)某一列求和
print(df2['面積'].sum())
# 對(duì)每一列求和
df2.sum()
1.2.4 count 計(jì)數(shù)
df.count()
對(duì)每一列計(jì)數(shù)
df['列名'].count()
對(duì)某一列計(jì)數(shù)
不統(tǒng)計(jì)NAN
# count 計(jì)數(shù)
# 對(duì)每一列計(jì)數(shù),不統(tǒng)計(jì)NAN
print(df2.count())
統(tǒng)計(jì)包含空值個(gè)數(shù):行數(shù)
# 統(tǒng)計(jì)包含空值個(gè)數(shù):行數(shù)
print(len(df2))
print(df2.shape[0])
print(df2['價(jià)格'].size)
# 包含NAN 列數(shù)
df2.count(axis=1)
1.2.5 std函數(shù)計(jì)算標(biāo)準(zhǔn)偏差
df.std()
對(duì)每一列標(biāo)準(zhǔn)差
df['列名'].std()
對(duì)某一列標(biāo)準(zhǔn)差
df.var()
對(duì)每一列方差
df['列名'].var()
對(duì)某一列方差
標(biāo)準(zhǔn)偏差:用以衡量數(shù)據(jù)值偏離算術(shù)平均值的程度。標(biāo)準(zhǔn)偏差越小,這些值偏離平均值就越少,反之亦然。
標(biāo)準(zhǔn)差=方差開(kāi)方
方差=每個(gè)值和平均值差值的平方
只對(duì)數(shù)值計(jì)算
# 標(biāo)準(zhǔn)差: sqrt(mean(x-mean(x))^2) 方差開(kāi)方
# 衡量數(shù)據(jù)值的離散程度 -> 標(biāo)準(zhǔn)差越小, 數(shù)據(jù)值越集中
# 對(duì)每列求標(biāo)準(zhǔn)差
print(df2.std())
# 對(duì)一列求標(biāo)準(zhǔn)差
print(df2['價(jià)格'].std())
# 方差: mean(x-mean(x))^2
# 對(duì)每一列求方差
print(df2.var())
# 對(duì)某一列求方差
print(df2['價(jià)格'].var())
1.2.6 median:中位數(shù)
df.median()
對(duì)每一列中位數(shù)
df['列名'].median()
對(duì)某一列中位數(shù)
df.mode()
對(duì)每一列眾數(shù)
df['列名'].mode()
對(duì)某一列眾數(shù)
print(df2['價(jià)格'].var())
#%%
# median:中位數(shù)
# 對(duì)每一列求中位數(shù)
print(df2.median())
# 對(duì)某一列求中位數(shù)
print(df2['價(jià)格'].median())
# mode:眾數(shù)
# 對(duì)每一列求眾數(shù)
print(df2.mode())
# 對(duì)某一列求眾數(shù)
print(df2['價(jià)格'].mode())
1.2.7 cumsum 累計(jì)求和
df.cumsum()
對(duì)每一列累計(jì)求和
df['列名'].cumsum()
對(duì)某一列累計(jì)求和
# cumsum:累計(jì)求和
print(df2['看房人數(shù)'].cumsum())
# 累計(jì)比較最大值
df2['看房人數(shù)'].cummax()
1.2.8 quantile函數(shù)計(jì)算分位數(shù)
- 分位數(shù)(Quantile),亦稱(chēng)分位點(diǎn),常用的有中位數(shù)(即二分位數(shù))、四分位數(shù)、百分位數(shù)等;那什么是分位數(shù)呢?我們以中位數(shù)為例:通過(guò)把一堆數(shù)字按大小排序后找出正中間的一個(gè)數(shù)字作為中位數(shù),如果這一堆數(shù)字有偶數(shù)個(gè),則中位數(shù)不唯一,通常取最中間的兩個(gè)數(shù)值的平均數(shù)作為中位數(shù),即二分位數(shù)。
- quantile函數(shù)默認(rèn)返回二分位數(shù);可以通過(guò)傳入?yún)?shù)來(lái)控制返回的四分位數(shù),或其他分位數(shù)
quantile(q=): 分位數(shù), 將列值排序后計(jì)算分位值
q: 設(shè)置分位點(diǎn) [0.25, 0.5, 0.75] [1/3, 2/3],不設(shè)置默認(rèn)是二位分
# quantile(q=): 分位數(shù), 將列值排序后計(jì)算分位值
# q: 設(shè)置分位點(diǎn) [0.25, 0.5, 0.75] [1/3, 2/3], 不設(shè)置默認(rèn)是二位分
print(df2['看房人數(shù)'].quantile())
# 查詢(xún)80%的看房人數(shù)信息
df2[df2['看房人數(shù)'] <= df2['看房人數(shù)'].quantile(q=0.8)]
- quantile(q=[]):設(shè)置分位點(diǎn)
# quantile(q=[]):設(shè)置分位點(diǎn)
df2['看房人數(shù)'].quantile(q=[0, 0.25, 0.5, 0.75, 1])
1.2.9 describe() 統(tǒng)計(jì)描述
df.describe()
對(duì)每一列統(tǒng)計(jì)描述
df['列名'].describe()
對(duì)某一列統(tǒng)計(jì)描述
# describe(): 統(tǒng)計(jì)描述
df2['看房人數(shù)'].describe()
1.2.10 corr 相關(guān)系數(shù)
corr(method=)
: 計(jì)算列之間的相關(guān)系數(shù)
method: 相關(guān)系數(shù)計(jì)算方式
查看列之間是否存在相關(guān)性 -> 面積和房?jī)r(jià)成正比 正比 反比
相關(guān)性值 -> [-1, 1] 值越大表示正相關(guān)越強(qiáng), 值越小表示負(fù)相關(guān)越強(qiáng)
print(df2.corr())
print(df.corr()) # 數(shù)量越多, 相關(guān)性可信度越強(qiáng)
df.corr(method='spearman')
1.3 Pandas函數(shù)小結(jié)
- 排序
- nlargest函數(shù) 由大到小排序獲取指定數(shù)量的數(shù)據(jù)
- nsmallest函數(shù) 由小到大排序獲取指定數(shù)量的數(shù)據(jù)
- sort_values函數(shù) 按值排序
- 聚合函數(shù)
- corr函數(shù) 相關(guān)性計(jì)算
- min函數(shù) 計(jì)算最小值
- max函數(shù) 計(jì)算最大值
- mean函數(shù) 計(jì)算平均值
- std函數(shù) 計(jì)算標(biāo)準(zhǔn)偏差
- quantile函數(shù) 計(jì)算分位數(shù)
- sum函數(shù) 計(jì)算所有數(shù)值的和
- count函數(shù) 計(jì)算非空數(shù)據(jù)的個(gè)數(shù)
2. Pandas 缺失值
好多數(shù)據(jù)集都含缺失數(shù)據(jù)。缺失數(shù)據(jù)有多種表現(xiàn)形式
- 數(shù)據(jù)庫(kù)中,缺失數(shù)據(jù)表示為
NULL
- 在某些編程語(yǔ)言中用
NA
或None
表示- 缺失值也可能是空字符串
''
或數(shù)值0
- 在Pandas中使用
NaN
表示缺失值
- Pandas中的NaN值來(lái)自NumPy庫(kù),NumPy中缺失值有幾種表示形式:NaN,NAN,nan,他們都一樣
2.1 Pandas缺失值的特點(diǎn)
- 缺失值和其它類(lèi)型的數(shù)據(jù)不同,它毫無(wú)意義,NaN不等于0,也不等于空字符串
print(NaN==NaN)
print(NaN==NAN)
print(NaN==nan)
print(nan==0)
print(nan=='')
print(nan==False)
- 缺失值從何而來(lái)呢?缺失值的來(lái)源有兩個(gè):
- 原始數(shù)據(jù)包含缺失值
- 數(shù)據(jù)整理過(guò)程中產(chǎn)生缺失值
2.2 加載包含缺失的數(shù)據(jù)
加載數(shù)據(jù)時(shí)可以通過(guò)
keep_default_na
與na_values
指定加載數(shù)據(jù)時(shí)的缺失值
pd.read_csv(keep_default_na=, na_values=)
pd.read_excel(keep_default_na=, na_values=)
keep_default_na=: 是否將空值加載成缺失值, 默認(rèn)True
na_values: 指定哪些值在加載時(shí)轉(zhuǎn)換成缺失值, 接受列表類(lèi)型 0->NaN
讀取數(shù)據(jù), 不將空值加載成缺失值,直接顯示空白
# 讀取數(shù)據(jù), 不將空值加載成缺失值,直接顯示空白
df1 = pd.read_csv('../data/city_day.csv',keep_default_na=False)
df1.head(10)
默認(rèn)是顯示NAN值的,也就是keep_default_na=True 為默認(rèn)
keep_default_na=False
指定將哪些值轉(zhuǎn)換成缺失值
# 加載數(shù)據(jù)集時(shí), 指定將哪些值轉(zhuǎn)換成缺失值
# na_values=['數(shù)據(jù)值']
df3 = pd.read_csv('../data/city_day.csv',na_values=['Ahmedabad'],keep_default_na=False)
df3.head(10)
2.3 查看缺失值
2.3.1 info查看缺失值個(gè)數(shù)
- 查看有多少缺失值
df.info()
# 查看有多少個(gè)缺失值
# 沒(méi)處理的
print(df.info())# 處理了
df1.info()
2.3.2 判斷數(shù)據(jù)值是否是缺失值
isnull()/isna(): 判斷數(shù)據(jù)值是否是缺失值,是缺失值返回True,不是返回False
notnull()/notna(): 判斷數(shù)據(jù)值是否不是缺失值,是缺失值返回False,不是返回True
- 判斷全部數(shù)據(jù)值是否是缺失值,為true是缺失值
# 判斷全部數(shù)據(jù)值是否是缺失值
df.isnull()
- 判斷某一列數(shù)據(jù)值是否是缺失值
# 判斷某一列數(shù)據(jù)值是否是缺失值
df['City'].isnull()
- 判斷全部數(shù)據(jù)值是否不是缺失值
# 判斷全部數(shù)據(jù)值是否不是缺失值
df.notnull()
- 判斷某一列數(shù)據(jù)值是否不是缺失值
# 判斷某一列數(shù)據(jù)值是否不是缺失值
df['City'].notnull()
- 使用isna 或者是 notna 判斷
# 判斷全部數(shù)據(jù)值是否是缺失值
df.isna()
# 判斷某一列數(shù)據(jù)值是否是缺失值
df['City'].isna()
# 判斷全部數(shù)據(jù)值是否不是缺失值
df.notna()
# 判斷某一列數(shù)據(jù)值是否不是缺失值
df['City'].notna()
2.2.3 統(tǒng)計(jì)缺失值個(gè)數(shù)
df.isnull().sum()
是缺失值返回1,不是返回0
# 統(tǒng)計(jì)每一列缺失值個(gè)數(shù),是缺失值返回1,不是返回0
# true-》1 ,false-》0
df.isnull().sum()
df.isnull().sum(axis=1)
統(tǒng)計(jì)每一行缺失值個(gè)數(shù),是缺失值返回1,不是返回0
# 統(tǒng)計(jì)每一行缺失值個(gè)數(shù),是缺失值返回1,不是返回0
df.isnull().sum(axis=1)
notnull().sum()
統(tǒng)計(jì)每一列非缺失值個(gè)數(shù),是缺失值返回1,不是返回0
count 也是這個(gè)效果
df.notnull().sum(axis=1)
統(tǒng)計(jì)每一行非缺失值個(gè)數(shù),是缺失值返回1,不是返回0
等價(jià)于df.count(axis=1)
2.4 Missingno庫(kù)對(duì)缺失值的情況進(jìn)行可視化探查
可以使用第三方庫(kù)Missingno來(lái)對(duì)缺失值進(jìn)行可視化
-
通過(guò)pip安裝missingno
pip install missingno -i https://pypi.tuna.tsinghua.edu.cn/simple/
- 導(dǎo)包
# 導(dǎo)包
import missingno as msno
import matplotlib.pyplot as plt
2.4.1 missingno.bar(df)缺失值數(shù)量可視化
利用
missingno.bar(df)
函數(shù)查看數(shù)據(jù)集數(shù)據(jù)完整性
msno.bar(df)
df=pd.read_csv('../data/city_day.csv')
# 繪制缺失值柱狀圖
msno.bar(df)
# 上面顯示的是非缺失值個(gè)數(shù)
# 區(qū)別在于是否有上面的一串?dāng)?shù)據(jù)
plt.show()
2.4.2 missingno.matrix(df)缺失值位置的可視化
msno.matrix(df)
# 全部數(shù)據(jù)繪制缺失值位置
msno.matrix(df)
隨機(jī)采樣1000條數(shù)據(jù),繪制缺失值位置
# 隨機(jī)采樣1000條數(shù)據(jù),繪制缺失值位置
msno.matrix(df.sample(1000))
2.4.3 missingno.heatmap(df)缺失值之間相關(guān)性可視化
繪制缺失值之間相關(guān)性
msno.heatmap(df)
# 繪制缺失值之間相關(guān)性
print(msno.heatmap(df))
plt.show()
3. 缺失值處理
缺失值的處理方法有以下幾種方式:
- 刪除缺失值:刪除缺失值會(huì)損失信息,并不推薦刪除,當(dāng)缺失數(shù)據(jù)占比較高的時(shí)候,或可以忽略相關(guān)性時(shí),可以嘗試使用刪除缺失值
- 填充缺失值:填充缺失值是指用一個(gè)估算的值來(lái)去替代缺失數(shù)
- 平均值、中位數(shù)
- 前后值填充,數(shù)據(jù)呈現(xiàn)順序變化的時(shí)候可以使用缺失值前邊或后邊的值進(jìn)行填充
- 線(xiàn)性插值:假定數(shù)據(jù)點(diǎn)之間存在嚴(yán)格的線(xiàn)性關(guān)系,并利用相鄰數(shù)據(jù)點(diǎn)中的非缺失值來(lái)計(jì)算缺失數(shù)據(jù)點(diǎn)的值
3.1 dropna刪除缺失值
- 刪除缺失值: 當(dāng)數(shù)據(jù)中缺失值占比很高時(shí), 可以選擇刪除; 刪除會(huì)導(dǎo)致丟失一些數(shù)據(jù), 影響分析
- 通過(guò)drop()方法刪除已知占比比較高的行或列
df.dropna(how=, subset=, axis=, inplace=, thresh=)
axis=0
- 可選參數(shù) ,默認(rèn)為0按行刪
- 0, or ‘index’:刪除包含缺失值的行
- 1, or ‘columns’:刪除包含缺失值的列
how='any'
- 可選參數(shù),默認(rèn)為any
- any: 如果存在NA值,則刪除該行或列
- all: 如果所有值都是NA,則刪除該行或列
inplace=False
- 可選參數(shù),不建議使用這個(gè)參數(shù)
- 默認(rèn)False, 不對(duì)原數(shù)據(jù)集進(jìn)行修改
- inplce=True,對(duì)原數(shù)據(jù)集進(jìn)行修改
subset接收一個(gè)列表
- 接收一個(gè)列表,列表中的元素為列名: 對(duì)特定的列進(jìn)行缺失值刪除處理
thresh=n
- 可選參數(shù)
- 參數(shù)值為int類(lèi)型,按行/列去除NaN值,去除NaN值后該行/列剩余數(shù)值的數(shù)量(列數(shù))大于等于n,便保留這一行/列
加載數(shù)據(jù):
df=pd.read_csv('../data/city_day.csv')
- 刪除列缺失值,只要有1個(gè)缺失值,就刪除整列數(shù)據(jù)
- df.dropna(axis=1,inplace=False)
# 刪除列缺失值,只要有1個(gè)缺失值,就刪除整列數(shù)據(jù)
df.dropna(axis=1,inplace=False)
- 刪除行缺失值,只要有1個(gè)缺失值,就刪除整行數(shù)據(jù)
- df.dropna(axis=0,inplace=False)
# 刪除行缺失值,只要有1個(gè)缺失值,就刪除整行數(shù)據(jù)
df.dropna(axis=0,inplace=False)
- 刪除所有值為缺失值的行數(shù)據(jù) // 刪除所有值為缺失值的列數(shù)據(jù)(一行或者一列全部為缺失值才會(huì)刪除)
# 刪除所有值為缺失值的行數(shù)據(jù)
df.dropna(axis=0,how='all',inplace=False)
# 刪除所有值為缺失值的列數(shù)據(jù)
df.dropna(axis=1,how='all',inplace=False)
- 刪除指定列中缺失值
- df.dropna(axis=0,subset=[‘列名’],inplace=False)
# 刪除指定列中缺失值
df.dropna(axis=0,subset=['PM2.5'],inplace=False)
- 刪除指定列中缺失值,這個(gè)列中有缺失值,就刪除這一行數(shù)據(jù)
# 刪除指定列中缺失值,這個(gè)列中有缺失值,就刪除這一行數(shù)據(jù)
df.dropna(axis=0,subset=['PM2.5','PM10'],inplace=False)
- 行數(shù)據(jù)中非缺失值個(gè)數(shù)大于等于thresh閾值就保留當(dāng)前行數(shù)據(jù)
# 行數(shù)據(jù)中非缺失值個(gè)數(shù)大于等于thresh閾值就保留當(dāng)前行數(shù)據(jù)
(df.head(10).dropna(axis=0,thresh=11,inplace=False))
3.2 填充缺失值
- 填充缺失值: 使用均值/中位數(shù)/眾數(shù)等值替換缺失值 優(yōu)先考慮的處理缺失值方式
df/s.fillna(value=, inplace=, method=)
- value: 需要填充的值 非時(shí)間序列的數(shù)據(jù)
- method: ffill->取缺失值的前一個(gè)值進(jìn)行填充 bfiil->取缺失值的后一個(gè)值進(jìn)行填充 時(shí)間序列的數(shù)據(jù)
3.2.1 常數(shù)值填充
填充全部缺失值
df.fillna(value=常數(shù))
# 常數(shù)值填充缺失值 - -全部缺失值
df.fillna(value=9999)
指定列填充缺失值
df【‘列名’】.fillna(value=常數(shù))
# 指定列填充缺失值
df['PM2.5'].fillna(value=9999)
# 指定列填充缺失值,以該列的均值填充
df['PM2.5'].fillna(value=df['PM2.5'].mean())
選擇數(shù)據(jù)填充缺失值
# 選擇數(shù)據(jù)填充缺失值
df['Xylene'][54:64].fillna(value=9999)
3.2.2 fillna前后值填充缺失值
時(shí)序數(shù)據(jù)在某一列值的變化往往有一定線(xiàn)性規(guī)律,絕大多數(shù)的時(shí)序數(shù)據(jù),具體的列值隨著時(shí)間的變化而變化,所以對(duì)于有時(shí)序的行數(shù)據(jù)缺失值處理可以使用上一個(gè)非空值或下一個(gè)非空值填充
- 使用上一個(gè)非空值(參數(shù)method=‘ffill’)填充空值
# 使用缺失值上一個(gè)非缺失值填充
df['Xylene'][54:64].fillna(method='ffill')
- 使用缺失值下一個(gè)非缺失值填充
# 使用缺失值下一個(gè)非缺失值填充
df['Xylene'][54:64].fillna(method='bfill')
3.2.3 interpolate線(xiàn)性插值
絕大多數(shù)的時(shí)序數(shù)據(jù),具體的列值隨著時(shí)間的變化而變化。 因此,除了使用bfill和ffill進(jìn)行插補(bǔ)以外還可以使用線(xiàn)性插值法:它假定數(shù)據(jù)點(diǎn)之間存在嚴(yán)格的線(xiàn)性關(guān)系,并利用相鄰數(shù)據(jù)點(diǎn)中的非缺失值來(lái)計(jì)算缺失數(shù)據(jù)點(diǎn)的值。
線(xiàn)性差值方式填充缺失值 時(shí)間序列的數(shù)據(jù) 了解
線(xiàn)性插值: 將缺失值前后的數(shù)據(jù)組合成線(xiàn)性關(guān)系, 根據(jù)線(xiàn)性計(jì)算推測(cè)出缺失位置的實(shí)際值
使用
df.interpolate(limit_direction="both")
對(duì)缺失數(shù)據(jù)進(jìn)行線(xiàn)性填充
# 線(xiàn)性插值方式填充缺失值
df['Xylene'][54:64].interpolate(method='linear')
3.3 缺失值處理小結(jié)
-
缺失值會(huì)影響分析計(jì)算的結(jié)果,這個(gè)結(jié)果又要用來(lái)指導(dǎo)生產(chǎn)經(jīng)營(yíng),所以要重視缺失值
-
空值僅指Pandas中的空值類(lèi)型,比如
NaN
-
缺失值包含空值,也有可能是空字符串、數(shù)字0、False或None等
-
不是空值的缺失值可以通過(guò)
replace
函數(shù)先替換為NaN
空值,之后再按空值進(jìn)行處
理解上面的內(nèi)容,并請(qǐng)對(duì)下面的API 有印象、能找到、能理解、能看懂 -
查看空值
df.info()
可以查看數(shù)據(jù)集每一列非空值的數(shù)量isnull
¬null
函數(shù) 判斷是否存在空值df.isnull().sum()
統(tǒng)計(jì)空值數(shù)量missingno
庫(kù)可以對(duì)空值進(jìn)行可視化探查missingno.matrix(df)
查看缺失值的位置missingno.heatmap(df)
查看缺失值之間的相關(guān)性
-
缺失值的處理
df.dropna()
刪除缺失值df.fillna(具體值)
將缺失值填充為具體指df.fillna(method='ffill')
使用上一個(gè)非空值進(jìn)行填充df.fillna(method='bfill')
使用下一個(gè)非空值進(jìn)行填充df.interpolate()
線(xiàn)性插值:假定數(shù)據(jù)點(diǎn)之間存在嚴(yán)格的線(xiàn)性關(guān)系,并利用相鄰數(shù)據(jù)點(diǎn)中的非缺失值來(lái)計(jì)算缺失數(shù)據(jù)點(diǎn)的值
4. Pandas數(shù)據(jù)類(lèi)型
4.1 Pandas 的數(shù)據(jù)結(jié)構(gòu)
Pandas 支持多種數(shù)據(jù)類(lèi)型,這使得它能夠靈活地處理各種數(shù)據(jù)結(jié)構(gòu)。以下是 Pandas 中主要的數(shù)據(jù)類(lèi)型:
數(shù)據(jù)結(jié)構(gòu)
- Series: 一維數(shù)組,可以保存任何數(shù)據(jù)類(lèi)型(整數(shù)、字符串、浮點(diǎn)數(shù)等),并且有一個(gè)與之相關(guān)的索引。
- DataFrame: 二維表格型數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)不同類(lèi)型的數(shù)據(jù)(每列可以有不同的數(shù)據(jù)類(lèi)型)。它類(lèi)似于 SQL 表格或者 Excel 工作表。
內(nèi)置數(shù)據(jù)類(lèi)型
Pandas 中的數(shù)據(jù)類(lèi)型主要基于 NumPy 的數(shù)據(jù)類(lèi)型。以下是 Pandas 中常見(jiàn)的數(shù)據(jù)類(lèi)型:
-
整數(shù)類(lèi)型
int8
: 8 位有符號(hào)整數(shù)。int16
: 16 位有符號(hào)整數(shù)。int32
: 32 位有符號(hào)整數(shù)。int64
: 64 位有符號(hào)整數(shù)。- 類(lèi)似的,還有無(wú)符號(hào)整數(shù)類(lèi)型
uint8
,uint16
,uint32
,uint64
。
-
浮點(diǎn)數(shù)類(lèi)型
float16
: 半精度浮點(diǎn)數(shù)。float32
: 單精度浮點(diǎn)數(shù)。float64
: 雙精度浮點(diǎn)數(shù)。
-
布爾類(lèi)型
bool
: 布爾值類(lèi)型。
-
對(duì)象類(lèi)型
object
: 通常用于字符串或其他不能用上述類(lèi)型表示的對(duì)象。
-
特殊數(shù)據(jù)類(lèi)型
datetime64
: 日期時(shí)間類(lèi)型,支持多種日期時(shí)間格式。timedelta64
: 時(shí)間間隔類(lèi)型,用于表示兩個(gè)日期時(shí)間之間的差異。category
: 分類(lèi)類(lèi)型,用于分類(lèi)變量。
查看和修改數(shù)據(jù)類(lèi)型
-
查看數(shù)據(jù)類(lèi)型
- 使用
.dtypes
屬性來(lái)查看 DataFrame 中各列的數(shù)據(jù)類(lèi)型。
- 使用
-
修改數(shù)據(jù)類(lèi)型
- 使用
.astype()
方法來(lái)改變數(shù)據(jù)類(lèi)型。
- 使用
Pandas數(shù)據(jù)類(lèi)型 | Python類(lèi)型 | 說(shuō)明 |
---|---|---|
object | str | 字符串 |
int64 | int | 整數(shù) |
float64 | float | 浮點(diǎn)數(shù) |
bool | bool | 布爾值 |
category | 無(wú)原生類(lèi)型 | 分類(lèi)類(lèi)型 |
datetime | 無(wú)原生類(lèi)型 | 時(shí)間日期類(lèi)型 |
timedelta | 無(wú)原生類(lèi)型 | 時(shí)間差類(lèi)型 |
4.2 查看數(shù)據(jù)類(lèi)型
字符串object 、整數(shù)int、小數(shù)float 以及 布爾值bool類(lèi)型都是比較常見(jiàn)的一般類(lèi)型
加載數(shù)據(jù):
df = pd.read_csv('../data/city_day.csv')
- 查看每一列數(shù)據(jù)類(lèi)型
# 查看每一列數(shù)據(jù)類(lèi)型
df.info()
df.dtypes
4.3 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
通過(guò) astype() 或 to_numeric() 實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換
s.astype(dtype=類(lèi)型名)
df.astype(dtype={列名:類(lèi)型名, 列名:類(lèi)型名, ...})
4.3.1 seriers.astype函數(shù)轉(zhuǎn)換數(shù)據(jù)類(lèi)型
- 將一列轉(zhuǎn)換為object類(lèi)型
object 和 str 都是字符串類(lèi)型,因此使用哪一個(gè)都可以
# 類(lèi)型轉(zhuǎn)換
# 將一列轉(zhuǎn)換為object類(lèi)型
df['PM2.5'] = df['PM2.5'].astype(dtype = object)
df['PM2.5'] = df['PM2.5'].astype(dtype = str)
df.info()
- 多列轉(zhuǎn)換為object類(lèi)型
多個(gè)列的時(shí)候需要使用字典進(jìn)行類(lèi)型的轉(zhuǎn)換
# 多列轉(zhuǎn)換為object類(lèi)型df.astype(dtype = {'PM2.5':object, 'PM10':object, 'SO2':object, 'NO2':object, 'CO':object, 'O3':object}).info()
- 將所有列轉(zhuǎn)換為object類(lèi)型
不指定任何列,就是全部列都進(jìn)行轉(zhuǎn)換
# 將所有列轉(zhuǎn)換為object類(lèi)型
df.astype(dtype=object).info()
注意:需要將有意義的列進(jìn)行類(lèi)型轉(zhuǎn)換
astype函數(shù)要求DataFrame列的數(shù)據(jù)類(lèi)型必須相同,當(dāng)有些數(shù)據(jù)中有缺失,但不是NaN時(shí)(如’missing’,'null’等),會(huì)使整列數(shù)據(jù)變成字符串類(lèi)型而不是數(shù)值型,這個(gè)時(shí)候就會(huì)報(bào)錯(cuò)
# 注意點(diǎn): 需要將有意義的列進(jìn)行類(lèi)型轉(zhuǎn)換
df2 = df.head().copy()
df2.loc[::2, 'NO'] = 'missing'
print(df2)
df2.info()
# df2['NO'].astype(dtype=float) # 報(bào)錯(cuò)
此時(shí)運(yùn)行下面的代碼會(huì)報(bào)錯(cuò)
ValueError: could not convert string to float: 'missing'
,無(wú)法使用astype函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換;這個(gè)時(shí)候我們可以使用to_numeric
函數(shù)
print(df2[‘NO’].astype(float))
4.3.2 pd.to_numeric函數(shù)字符串轉(zhuǎn)數(shù)字類(lèi)型
astype函數(shù)要求DataFrame列的數(shù)據(jù)類(lèi)型必須相同,當(dāng)有些數(shù)據(jù)中有缺失,但不是NaN時(shí)(如’missing’,'null’等),會(huì)使整列數(shù)據(jù)變成字符串類(lèi)型而不是數(shù)值型,這個(gè)時(shí)候可以使用to_numeric處理
- pd.to_numeric函數(shù)的參數(shù)errors, 它決定了當(dāng)該函數(shù)遇到無(wú)法轉(zhuǎn)換的數(shù)值時(shí)該如何處理
- 默認(rèn)情況下,該值為raise,如果to_numeric遇到無(wú)法轉(zhuǎn)換的值時(shí),會(huì)拋出異常
- coerce: 如果to_numeric遇到無(wú)法轉(zhuǎn)換的值時(shí),會(huì)返回NaN值
- ignore: 如果to_numeric遇到無(wú)法轉(zhuǎn)換的值時(shí)會(huì)放棄轉(zhuǎn)換,什么都不做
pd.to_numeric(df2['NO'], errors='coerce')
df2['NO'] = pd.to_numeric(df2['NO'], errors='coerce')
df2.info()
4.4 category 分類(lèi)類(lèi)型
- category類(lèi)型是比較特殊的數(shù)據(jù)類(lèi)型,是由固定的且有限數(shù)量的變量組成的,比如性別,分為男、女、保密;轉(zhuǎn)換方法可以使用astype函數(shù)
- category類(lèi)型的數(shù)據(jù)中的分類(lèi)是有順序的
- category類(lèi)型在內(nèi)存中使用的空間比字符串或其他數(shù)據(jù)類(lèi)型更小。這對(duì)于數(shù)據(jù)集中有限且重復(fù)的值非常有用
4.4.1 創(chuàng)建 category 分類(lèi)類(lèi)型
- 方式一
# 創(chuàng)建分類(lèi)類(lèi)型數(shù)據(jù)
# 指定的分類(lèi)類(lèi)別為12345, 數(shù)據(jù)就對(duì)應(yīng)這5類(lèi), 不屬于指定分類(lèi)類(lèi)別的用NaN替換
s1= pd.Series(data=pd.Categorical(values = [1,2,3,4,5,6,7,8,9,10], categories=[1,2,3,4,5]))
s1
- 方式二
s2 = pd.Series(data=[1,5,6,7,8,1,5,6],dtype='category')
print(s2)
print(type(s2))
4.4.2 category 分類(lèi)類(lèi)型轉(zhuǎn)換
通過(guò)
astype
方法轉(zhuǎn)換成category類(lèi)型
#通過(guò)astype方法轉(zhuǎn)換成category類(lèi)型
df['City'] = df['City'].astype(dtype='category')
df.info()
4.5 datetime時(shí)間類(lèi)型
python沒(méi)有原生的datetime數(shù)據(jù)類(lèi)型,需要使用datetime包
from datetime import datetime
now = datetime.now()
someday = datetime(2020, 1, 1)
print(now)
print(type(now))
print(someday)
print(type(someday))
4.5.1 查看數(shù)據(jù)時(shí)間
# python中的日期時(shí)間
# 需要借助datetime模塊進(jìn)行處理
from datetime import datetime
# 獲取當(dāng)前時(shí)間
datetime.now()
# 獲取當(dāng)前類(lèi)型
print(type(datetime.now()))
# 獲取當(dāng)前日期和時(shí)間
print(datetime.now())
# 獲取當(dāng)前日期
print(datetime.now().date())
# 獲取當(dāng)前年份
print(datetime.now().year)
# 獲取當(dāng)前時(shí)間
print(datetime.now().time())
# 獲取當(dāng)前月份
print(datetime.now().month)
4.5.2 創(chuàng)建日期時(shí)間
datetime(年,月,日,小時(shí),分鐘,秒)
# 創(chuàng)建日期時(shí)間
someday = datetime(2024,8,10)
print(someday)
print(type(someday))
4.5.3 時(shí)間戳
datetime.now().timestamp()
# 時(shí)間戳
print(datetime.now().timestamp())
# 或者now()也可以查看
datetime.now()
4.5.4 時(shí)間函數(shù)格式化
strftime() -> f:format
日期時(shí)間格式化后轉(zhuǎn)換成字符串類(lèi)型
strptime()
-> p:parse 字符串類(lèi)型的日期時(shí)間解析成日期時(shí)間類(lèi)型
datetime.now().strftime(格式)
datetime.strptime(s1, 格式)
# strftime() -> f:format 日期時(shí)間格式化后轉(zhuǎn)換成字符串類(lèi)型
print(datetime.now().strftime(format='%Y-%m-%d %H:%M:%S'))
# # strptime() -> p:parse 字符串類(lèi)型的日期時(shí)間解析成日期時(shí)間類(lèi)型
# '%Y-%m-%d %H:%M'->字符串是什么日期時(shí)間格式就寫(xiě)什么格式, 格式不一致會(huì)發(fā)生報(bào)錯(cuò)!!!
s1= datetime.now().strftime(format='%Y-%m-%d %H:%M:%S')
s2 =datetime.strptime(s1, '%Y-%m-%d %H:%M:%S')
print(s2)
print(type(s2))
4.5.5 日期類(lèi)型的轉(zhuǎn)換
加載數(shù)據(jù)集時(shí)轉(zhuǎn)換成日期類(lèi)型
pd.read_csv(parse_dates=[列名1, 列名2, …])
pd.read_excel(parse_dates=[列名1, 列名2, …])
df = pd.read_csv(‘data/city_day.csv’, parse_dates=[‘Date’])
- 加載數(shù)據(jù)集時(shí)轉(zhuǎn)換成日期類(lèi)型
可以通過(guò)列名 或者是 列下標(biāo)
# 加載數(shù)據(jù)集時(shí)轉(zhuǎn)換成日期類(lèi)型,通過(guò)列名轉(zhuǎn)換
df = pd.read_csv('../data/city_day.csv', parse_dates=['Date'])
df.info()
# 通過(guò)下標(biāo)進(jìn)行轉(zhuǎn)換
df1 = pd.read_csv('../data/city_day.csv', parse_dates=[1])
df1.info()
- 通過(guò) astype(dtype=日期類(lèi)型) 將一列轉(zhuǎn)化為時(shí)間類(lèi)型
- 通過(guò) pd.to_datetime(df[‘列名’]) 將字符串轉(zhuǎn)換為時(shí)間日期類(lèi)型
# astype(dtype=日期類(lèi)型)
df = pd.read_csv('../data/city_day.csv')
df['Date'] = df['Date'].astype(dtype='datetime64[ns]')
df.info()
# pd.to_datetime(列名,unit )
df = pd.read_csv('../data/city_day.csv')
df['Date'] = pd.to_datetime(df['Date'])
df.info()
4.6 提取日期類(lèi)型的部分時(shí)間
在 Pandas 中,如果有一個(gè)包含日期時(shí)間的 Series 或 DataFrame 列,您可以輕松地提取日期時(shí)間的不同部分。
通過(guò)使用
.dt
屬性訪(fǎng)問(wèn)日期時(shí)間組件來(lái)實(shí)現(xiàn)。
常用的日期時(shí)間組件
- Year: 年份
- Month: 月份
- Day: 日
- Hour: 小時(shí)
- Minute: 分鐘
- Second: 秒
- Week: 星期
- Day of Week: 星期幾(0-6,其中 0 代表周一)
- Quarter: 季度
- Timestamp: 完整的時(shí)間戳
注意事項(xiàng)
- 確保您的日期時(shí)間數(shù)據(jù)已經(jīng)正確轉(zhuǎn)換為
datetime64
類(lèi)型。 - 如果日期時(shí)間數(shù)據(jù)包含時(shí)區(qū)信息,可以使用
.dt.tz_localize()
和.dt.tz_convert()
來(lái)處理時(shí)區(qū)轉(zhuǎn)換。
# 提取日期類(lèi)型中的部分時(shí)間
# 獲取日期類(lèi)型的s對(duì)象的部分時(shí)間
# 列名.dt.year 年
# 列名.dt.month 月
# 打印數(shù)據(jù)中的年份
print(df['Date'].dt.year.head())
# 打印數(shù)據(jù)中的月份
print(df['Date'].dt.month.head())
# 打印數(shù)據(jù)中的日期
print(df['Date'].dt.day.head())
# 打印數(shù)據(jù)中的小時(shí)
print(df['Date'].dt.hour.head())
# 打印數(shù)據(jù)中的季度
print(df['Date'].dt.quarter.head())
# 打印數(shù)據(jù)中的周數(shù)
print(df['Date'].dt.week.head())
# 打印數(shù)據(jù)中的工作日
print(df['Date'].dt.weekday.head())
# 打印數(shù)據(jù)中的年內(nèi)天數(shù)
print(df['Date'].dt.dayofyear.head())
# 打印數(shù)據(jù)中的是否為閏年
print(df['Date'].dt.is_leap_year.head())
# 打印數(shù)據(jù)中的是否為月初
print(df['Date'].dt.is_month_start.head())
# 打印數(shù)據(jù)中的是否為月末
print(df['Date'].dt.is_month_end.head())
# 打印數(shù)據(jù)中的是否為季度初
print(df['Date'].dt.is_quarter_start.head())
# 打印數(shù)據(jù)中的是否為季度末
print(df['Date'].dt.is_quarter_end.head())
# 打印數(shù)據(jù)中的是否為年初
print(df['Date'].dt.is_year_start.head())
# 打印數(shù)據(jù)中的是否為年末
print(df['Date'].dt.is_year_end.head())
- python中提取一個(gè)時(shí)間值中的部分時(shí)間 變量名.year
# python中提取一個(gè)時(shí)間值中的部分時(shí)間 變量名.year
someday = datetime(2024, 6, 17)
print(someday)
print(someday.year)
4.7 日期類(lèi)型運(yùn)算
可以通過(guò)S對(duì)象的內(nèi)置函數(shù)獲取數(shù)據(jù)
df['列名'].min()
df['列名'].max()
# 日期運(yùn)算, 獲取日期類(lèi)型中的最小值和最大值
print(df['Date'].min())
print(df['Date'].max())
# 獲取日期類(lèi)型中的差值
print(df['Date'].max() - df['Date'].min())
4.8 日期類(lèi)型列作為索引
4.8.1 df.set_index(keys=‘列名’) 設(shè)置索引
df.set_index(keys='列名')
temp_df = df.set_index(keys='Date')
temp_df.head()
查看索引
temp_df.index
4.8.2 加載數(shù)據(jù)的時(shí)候指定索引
pd.read_csv(路徑,index_col='列名',parse_dates=True)
# index_col: 指定列為索引
# parse_dates: True->將索引轉(zhuǎn)換成日期類(lèi)型
df1 = pd.read_csv('../data/city_day.csv',index_col='Date',parse_dates=True)
df1.index
4.8.3 日期類(lèi)型索引獲取部分?jǐn)?shù)據(jù)
# 日期類(lèi)型索引可以獲取部分?jǐn)?shù)據(jù)
# 先要對(duì)日期類(lèi)型索引進(jìn)行排序
df1.sort_index(inplace=True)
# 獲取2015年8月的數(shù)據(jù)子集
print(df1.loc['2015-08'])
# 獲取2015年的數(shù)據(jù)子集
print(df1.loc['2015'])
# 獲取時(shí)間范圍內(nèi)的數(shù)據(jù)子集
print(df1.loc['2015-01-01 22':'2015-05-05 10:22:33'])
5. timedelta時(shí)間差類(lèi)型
5.1 timedelta時(shí)間差類(lèi)型 介紹
在 Pandas 中,Timedelta
類(lèi)型用于表示兩個(gè)日期時(shí)間之間的差值。這種類(lèi)型非常有用,尤其是在處理時(shí)間序列數(shù)據(jù)時(shí)。下面是一些關(guān)于 Timedelta
類(lèi)型的基礎(chǔ)知識(shí)和示例。
- 創(chuàng)建 Timedelta 對(duì)象
可以使用pd.Timedelta
或者字符串來(lái)創(chuàng)建Timedelta
對(duì)象。
使用 pd.Timedelta
創(chuàng)建
import pandas as pd# 創(chuàng)建 Timedelta 對(duì)象
td1 = pd.Timedelta(days=10, hours=2, minutes=30)
print(td1)
使用字符串創(chuàng)建
# 使用字符串創(chuàng)建 Timedelta 對(duì)象
td2 = pd.Timedelta('1 days 2 hours 30 minutes')
print(td2)
Timedelta 屬性
Timedelta
對(duì)象有一些有用的屬性來(lái)獲取時(shí)間差的具體組成部分。
- 屬性示例
# 獲取 Timedelta 的屬性
print(td1.days) # 天數(shù)
print(td1.seconds) # 秒數(shù)
print(td1.microseconds) # 微秒數(shù)
print(td1.components) # 各個(gè)時(shí)間單位的組成部分
-
運(yùn)算操作
Timedelta
對(duì)象可以與其他Timedelta
對(duì)象或日期時(shí)間對(duì)象進(jìn)行運(yùn)算。 -
加法和減法
# 創(chuàng)建另一個(gè) Timedelta 對(duì)象
td3 = pd.Timedelta('2 days 1 hour')# 加法
result_add = td1 + td3
print(result_add)# 減法
result_subtract = td1 - td3
print(result_subtract)
- 與日期時(shí)間的運(yùn)算
# 創(chuàng)建日期時(shí)間對(duì)象
dt = pd.Timestamp('2024-01-01')# 加法
result_add_dt = dt + td1
print(result_add_dt)# 減法
result_subtract_dt = dt - td1
print(result_subtract_dt)
- 比較運(yùn)算
可以使用比較運(yùn)算符來(lái)比較Timedelta
對(duì)象。
# 比較運(yùn)算
print(td1 > td3) # 大于
print(td1 < td3) # 小于
print(td1 == td3) # 等于
5.2 時(shí)間差類(lèi)型運(yùn)算
# 獲取當(dāng)前時(shí)間與任意一個(gè)之間的時(shí)間差
print(datetime.now()-datetime(2020, 8, 10))
print(type(datetime.now()-datetime(2020, 8, 10)))
- pandas 時(shí)間差類(lèi)型
# pandas 時(shí)間差類(lèi)型
df2 = pd.read_csv('../data/city_day.csv',parse_dates=['Date'])
df2['ref_date'] = datetime.now() - df2['Date']
df2.head()
- 獲取時(shí)間差類(lèi)型中的整數(shù)部分
# 獲取時(shí)間差類(lèi)型中的整數(shù)部分
df2['ref_date'].dt.days
5.3 pd.to_timedelta函數(shù)轉(zhuǎn)換timedelta類(lèi)型
可以使用astype 也可以使用 to_timedelta 將字符串?dāng)?shù)據(jù)轉(zhuǎn)換為時(shí)間數(shù)據(jù)
# 字符串類(lèi)型轉(zhuǎn)換成時(shí)間差類(lèi)型
print(df2['ref_date'].astype(dtype='timedelta64[ns]'))
pd.to_timedelta(df2['ref_date'])
5.4 timedelta類(lèi)型數(shù)據(jù)作為df索引
將timedelta類(lèi)型數(shù)據(jù)作為df索引,就可以基于時(shí)間差范圍來(lái)選擇數(shù)據(jù)(將時(shí)間差列設(shè)置為索引, 獲取數(shù)據(jù)子集)
修改數(shù)據(jù)將時(shí)間差列作為索引
# 將時(shí)間差列設(shè)置為索引, 獲取數(shù)據(jù)子集
df2['ref_date']= df2['ref_date'].dt.days
df2.set_index(keys='ref_date', inplace=True)
df2
索引排序,不排序會(huì)發(fā)生報(bào)錯(cuò)
通過(guò)**
df2.loc['索引值1' : '索引值2']
**,來(lái)獲取部分?jǐn)?shù)據(jù),拿到索引值1 到 索引值2 之間的數(shù)據(jù)
# 索引排序,不排序會(huì)發(fā)生報(bào)錯(cuò)
df2.sort_index(inplace=True)
df2.loc['3506']
df2.loc['3500' : '3509']
6. Pandas 數(shù)據(jù)類(lèi)型的小結(jié)
6.1 Pandas中的數(shù)據(jù)類(lèi)型
Pandas數(shù)據(jù)類(lèi)型 | Python類(lèi)型 | 說(shuō)明 |
---|---|---|
object | str | 字符串 |
int64 | int | 整數(shù) |
float64 | float | 浮點(diǎn)數(shù) |
bool | bool | 布爾值 |
category | 無(wú)原生類(lèi)型 | 分類(lèi)類(lèi)型 |
datetime | 無(wú)原生類(lèi)型 | 時(shí)間日期類(lèi)型 |
timedelta | 無(wú)原生類(lèi)型 | 時(shí)間差類(lèi)型 |
6.2 Pandas中數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類(lèi)型的關(guān)系
- pandas是基于numpy構(gòu)建的包,所以pandas中的數(shù)據(jù)類(lèi)型都是基于Numpy中的ndarray類(lèi)型實(shí)現(xiàn)的
- Pandas中的數(shù)據(jù)結(jié)構(gòu)對(duì)象和數(shù)據(jù)類(lèi)型對(duì)象:
- dataframe 表 【數(shù)據(jù)結(jié)構(gòu)】
- series 列【數(shù)據(jù)結(jié)構(gòu)】
- object --> python str 字符串 【數(shù)據(jù)類(lèi)型】
- int64 --> python int 整數(shù) 【數(shù)據(jù)類(lèi)型】
- float64 --> python float 小數(shù) 【數(shù)據(jù)類(lèi)型】
- bool --> python bool True False 【數(shù)據(jù)類(lèi)型】
- datetime64 --> python datetime 時(shí)間日期 【數(shù)據(jù)類(lèi)型】
- series 列【數(shù)據(jù)結(jié)構(gòu)】
- dataframe 表 【數(shù)據(jù)結(jié)構(gòu)】
- timedelta[ns]–> 兩個(gè)時(shí)間點(diǎn)之間相距的時(shí)間差,單位是納秒 【數(shù)據(jù)類(lèi)型】
- category --> 特定分類(lèi)數(shù)據(jù)類(lèi)型,比如性別分為男、女、其他 【數(shù)據(jù)類(lèi)型】
6.3 Pandas數(shù)據(jù)類(lèi)型轉(zhuǎn)換基本方法
df['列名'].astype(str)
- 當(dāng)Seriers對(duì)象使用astype函數(shù)轉(zhuǎn)換的結(jié)果中數(shù)據(jù)類(lèi)型不同時(shí),使用to_numeric函數(shù)
pd.to_numeric(df['列名'], errors='coerce')
無(wú)法轉(zhuǎn)換的值返回NaNpd.to_numeric(df['列名'], errors='ignore')
無(wú)法轉(zhuǎn)換的值返回原值
6.4 category分類(lèi)類(lèi)型
- 創(chuàng)建方式
s = pd.Series(['B','D','C','A'], dtype='category')
6.5 datetime時(shí)間類(lèi)型
- datetime時(shí)間類(lèi)型的Seriers來(lái)源兩種方式:
- 讀取時(shí)指定
df = pd.read_csv('..xxx.csv', parse_dates=[1])
- 轉(zhuǎn)換
df['Date'] = pd.to_datetime(df['Date'])
- 讀取時(shí)指定
- 提取datetime時(shí)間類(lèi)型的Seriers中的具體年月日時(shí)分秒星期
df['Date'].dt.year
df['Date'].dt.quarter
# 季度df['Date'].dt.dayofweek + 1
# 星期
- 提取datetime時(shí)間類(lèi)型的Seriers中的某一個(gè)值的具體年月日時(shí)分秒星期
df4['Date'][0].dayofweek+1 # 星期
- datetime時(shí)間類(lèi)型的Seriers可以進(jìn)行時(shí)間計(jì)算
- 直接調(diào)用聚合函數(shù)
df['Date'].max() # 最近的日期
- 計(jì)算時(shí)間差
df['Date'] - df['Date'].min() # 返回時(shí)間差類(lèi)型數(shù)據(jù)構(gòu)成的Seriers
- 直接調(diào)用聚合函數(shù)
- datetime時(shí)間類(lèi)型的S對(duì)象作為索引的兩種方式
df = pd.read_csv('..xxx.csv', index_col='Date', parse_dates=True)
df.index = df['date']
- 注意:要對(duì)索引進(jìn)行重新排序 必要步驟
df = df.sort_index()
- datetime時(shí)間類(lèi)型索引可以按照時(shí)間范圍取子集
df['2018']
df['2016-06']
df.loc['2015-3-4 22': '2016-1-1 23:45:00']
6.6 timedelta時(shí)間差類(lèi)型
- timedelta時(shí)間差類(lèi)型的創(chuàng)建:
df['date_diff'] = df['Date'] - df['Date'].min()
- 字符串類(lèi)型轉(zhuǎn)換為時(shí)間差類(lèi)型
s2 = pd.to_timedelta(s1)
- timedelta時(shí)間差類(lèi)型設(shè)為索引
df.index = df['Date'] - df['Date'].min()
- 基于時(shí)間差范圍來(lái)選擇數(shù)據(jù)
df['0 days':'4 days']