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