数据规整
// Pandas分組聚合
創(chuàng)建對象:姓名、歷次測驗(yàn)語文成績,數(shù)學(xué)成績,英語成績
df = pd.DataFrame({'name': ['張三','李四','王五','李四','王五','王五','趙六'],'chinese':np.random.randint(35,100,7),'math':np.random.randint(35,100,7),'english':np.random.randint(35,100,7),'test': ['一','一','一','二','二','三','一'] })df df.index,df.columns統(tǒng)計(jì)分析:
# 按列求科目成績平均值 df.mean()# 按行求學(xué)生每次考試平均值 df.mean(axis='columns')# 快速綜合統(tǒng)計(jì) df.describe()分組:
groupby(),一般指以下一個或多個操作步驟的集合
- Splitting 將數(shù)據(jù)分組
- Applying 對每個分組應(yīng)用不同的function
- Combining 使用某種數(shù)據(jù)結(jié)果展示結(jié)果
更多操作:
# 分組數(shù)據(jù)的個數(shù) df.groupby('name').size()# 遍歷分組對象 for (method, group) in df.groupby('name'): # print(method) # print(group)print(group.shape)# 對分組后的部分列做統(tǒng)計(jì) df.groupby('name')['math'].describe() # 行列旋轉(zhuǎn) df.groupby('name')['math'].describe().unstack()聚合:
aggregate(),或agg()
aggregate函數(shù)的參數(shù):
- 參數(shù)可以是列表,列表元素是指標(biāo)的計(jì)算函數(shù)或特定的指標(biāo)名字符串
- 參數(shù)可以是字典,函數(shù)會根據(jù)字典內(nèi)容對指定列進(jìn)行不同的指標(biāo)計(jì)算
- 參數(shù)可以是系統(tǒng)或自定義函數(shù),各分組都進(jìn)行計(jì)算后返回結(jié)果
其他分組運(yùn)算
運(yùn)用 groupby 函數(shù)進(jìn)行分組后,我們能做的事情還有很多,并不局限于聚合匯總
利用 fliter 函數(shù)來對分組進(jìn)行篩選,留下符合條件的分組:
def filter_func(x):return x['math'].mean() >= 60 # 數(shù)學(xué)成績平均值大于等于60分e = df.groupby('name').filter(filter_func) e.groupby('name').mean()使用 transform 函數(shù)對所有的數(shù)據(jù)元素進(jìn)行轉(zhuǎn)換計(jì)算:
# 所有列減去60 df.groupby('name').transform(lambda x: x - 60)運(yùn)用 apply 函數(shù),我們可以一次性對所有的分組進(jìn)行不同規(guī)則的運(yùn)算:
# 某列單獨(dú)計(jì)算 def a2(x):x['chinese'] = x['chinese'] + 10x['english'] -= 10return xdf.groupby('name').apply(a2)在 groupby 函數(shù)的輸入中自定義分配每一行記錄所屬的分組
如果我們的輸入就是原始數(shù)據(jù)集 df 中的某一列,那么這一列將被作為分組的依據(jù),這種方法比直接輸入列名要顯得麻煩一些
# 傳入結(jié)構(gòu)一樣的列,傳入索引會替換掉原索引 df.groupby(['張三','李四','王五','李四','王五','王五','張三']).mean() df.groupby([0,0,0,0,0,0,0]).mean()groupby 函數(shù)將會根據(jù)索引值進(jìn)行分組,我們可以通過輸入一個字典對象的方式,來給不同的索引值重新分配組別:
df2 = df.set_index('name') df2# 合并行計(jì)算 mapping = {'張三': '一個人', '趙六': '一個人', '李四': '李四new'} df2.groupby(mapping).mean()# 通過輸入一個列表的形式來使多種映射同時生效: df2.groupby(['name', mapping]).mean()綜合應(yīng)用:輸出所有人在所有測試中的數(shù)學(xué)成績
# 所有人在所有測試中的數(shù)學(xué)成績 df.groupby(['name',df['test']])['math'].mean().unstack().fillna(0)總結(jié)
- 上一篇: BIGO | imo实时语音传输优化揭秘
- 下一篇: google earth engine