pandas:聚合統計、資料分箱、分組視覺化
阿新 • • 發佈:2022-05-21
1、聚合統計
1.1描述統計
#df.describe(),對資料的總體特徵進行描述
df.groupby('team').describe()
df.groupby('team').describe().T #列數太多,進行轉置
1.2統計函式
#對分組物件直接使用統計函式,分組內資料進行計算,返回df形式的資料
#計算平均數
df.groupby('team').mean()
#相關性係數
df.groupby('team').corr()
#每組的累計最大值
df.groupby('team').cummax()
1.3聚合方法agg()
將分組後的物件給定統計方法,支援按欄位分別給定不同的統計方法
#所有列使用一個計算方法
df.groupby('team').agg(sum)
df.groupby('team').agg(np.size)
#一個欄位使用多種統計方法,不同欄位使用不同表達
grouped = df.groupby("team")
grouped[['Q1','Q2']].agg([np.sum,np.mean,np.std])
#不同列使用不同計算方法,且一個列用多個計算方法 df.groupby("team").agg({'Q1':['min','max'],'Q2':['sum']})
#agg()可以指定新列的名字,新列的名字為Mean,Sum
grouped.Q1.agg(Mean='mean',Sum='sum')
#Mean為Q1計算平均值,Sum為Q2計算和。
grouped.agg(Mean=('Q1','mean'),Sum=('Q2','sum'))
#如果列名不是有效的Python變數格式 比如列名是‘1_max’
grouped.agg(**{'1_max':pd.NamedAgg(column='Q1',aggfunc='max')})
#使用函式,分別傳入每個分組的子df,按子df把這組所有的列組成的序列傳到函式裡進行計算,返回固定值 #lambda函式,所有方法都可以使用 def max_min(x): return x.max()-x.min() df.groupby('team').Q1.agg(Mean='mean', Sum='sum', Diff=lambda x: x.max()-x.min(), Max_min=max_min)
1.4時序重取樣resample()
針對時間序列資料,resample()將分組後的時間索引按週期進行聚合統計
#建立一組資料:
idx = pd.date_range('5/21/2022',periods=100,freq='T')
df2 = pd.DataFrame(data={'a':[0,1]*50,'b':1},index=idx)
df2
#索引為一個時序資料,按a列進行分組,按每20min對b進行求和
df2.groupby('a').resample('20T').sum()
df2.groupby('a').sum()
#以右邊時間點為標識
df2.groupby('a').resample('3T',closed='right').sum()
#按月份為週期取樣
df2.groupby('a').resample('M').sum()
1.5組內頭尾值
#所有組的第一個值
df.groupby('team').first()
#最後一個值
grouped.last()
1.6組內分位數
#二分位數
grouped.quantile(0.5)
grouped.median()
1.7組內差值
grouped[['Q1','Q2','Q3','Q4']].diff().head(10)
2、資料分箱
資料分箱將原始資料分成幾個小區間,即bin(小箱子)
落入給定區間的原始資料值 被 代表該區間的值 替換
可以有助於減少過擬合,平滑輸入資料
pd.cut :指定分界點 pd.qcut :指定區間數量,等寬分箱處理
2.1定界分箱
#pd.cut指定區間,將數字進行劃分
#將Q1成績按0,60,100
pd.cut(df.Q1,bins=[0,60,100])
'''
```
0 (60, 100]
1 (0, 60]
2 (0, 60]
3 (60, 100]
4 (60, 100]
...
95 (0, 60]
96 (0, 60]
97 (60, 100]
98 (0, 60]
99 (0, 60]
Name: Q1, Length: 100, dtype: category
Categories (2, interval[int64]): [(0, 60] < (60, 100]]
```
'''
#將分箱結果應用到groupby分組
df.Q1.groupby(pd.cut(df.Q1,bins=[0,60,100])).count()
'''
```
Q1
(0, 60] 57
(60, 100] 43
Name: Q1, dtype: int64
```
'''
# DateFrame使用
df.groupby(pd.cut(df.Q1,bins=[0,60,100])).count()
# 顯示了每個分組的資料
pd.cut(df.Q1,bins=[0,60,100],labels=['不及格','及格'])
pd.cut(df.Q1,bins=[0,60,100],labels=['不及格','及格']).count()
'''
```
0 及格
1 不及格
2 不及格
3 及格
4 及格
...
95 不及格
96 不及格
97 及格
98 不及格
99 不及格
Name: Q1, Length: 100, dtype: category
Categories (2, object): ['不及格' < '及格']
```
'''
2.2等寬分箱
#按Q1成績分為兩組
pd.qcut(df.Q1,q=2)
'''
```
0 (51.5, 98.0]
1 (0.999, 51.5]
2 (51.5, 98.0]
3 (51.5, 98.0]
4 (51.5, 98.0]
...
95 (0.999, 51.5]
96 (0.999, 51.5]
97 (51.5, 98.0]
98 (0.999, 51.5]
99 (0.999, 51.5]
Name: Q1, Length: 100, dtype: category
Categories (2, interval[float64]): [(0.999, 51.5] < (51.5, 98.0]]
```
'''
#檢視分組區間
pd.qcut(df.Q1,q=2).unique()
'''
```
[(51.5, 98.0], (0.999, 51.5]]
Categories (2, interval[float64]): [(0.999, 51.5] < (51.5, 98.0]]
```
'''
#應用到分組中:
#series使用
df.Q1.groupby(pd.qcut(df.Q1,q=2)).count()
'''
```
Q1
(0.999, 51.5] 50
(51.5, 98.0] 50
Name: Q1, dtype: int64
```
'''
#DateFrame使用
df.groupby(pd.qcut(df.Q1,q=2)).count()
#指定標籤名
pd.qcut(range(5),3,labels=['good','medium','bad'])
'''
```
['good', 'good', 'medium', 'bad', 'bad']
Categories (3, object): ['good' < 'medium' < 'bad']
```
'''
#返回箱子標籤
pd.qcut(df.Q1,q=2,retbins=True)
3、分組視覺化
3.1繪圖方法
#分組,設定索引為name
grouped = df.set_index('name').groupby('team')
grouped.plot()
3.2直方圖hist()
#繪製直方圖
grouped.hist()
3.3箱線圖boxplot()
分組箱線圖
grouped.boxplot(figsize=(15,12))
分組箱線圖,按team分組並返回箱線圖
df.boxplot(by='team',figsize=(15,10))