分組統計 - DataFrame.groupby() 所見的各種用法 - Python代碼


分組統計 - DataFrame.groupby() 所見的各種用法 - Python代碼
原創黃大俠aa 最后發布於2019-01-31 17:59:54 閱讀數 2930 收藏
展開
目錄

所見 1 :日常用法

所見 2 :解決groupby.sum() 后層級索引levels上移的問題

所見 3 :解決groupby.apply() 后層級索引levels上移的問題

所見 4 :groupby函數的分組結果保存成DataFrame

groupby的函數定義:

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

by :接收映射、函數、標簽或標簽列表;用於確定聚合的組。
axis : 接收 0/1;用於表示沿行(0)或列(1)分割。
level : 接收int、級別名稱或序列,默認為None;如果軸是一個多索引(層次化),則按一個或多個特定級別分組。
as_index:接收布爾值,默認Ture;Ture則返回以組標簽為索引的對象,False則不以組標簽為索引。
其他的參數解釋就看文檔吧:鏈接:pandas.DataFrame.groupby 介紹文檔

 

所見 1 :日常用法
import pandas as pd

df = pd.DataFrame({'Gender' : ['男', '女', '男', '男', '男', '男', '女', '女', '女'],
'name' : ['周傑倫', '蔡依林', '林俊傑', '周傑倫', '林俊傑', '周傑倫', '田馥甄', '蔡依林', '田馥甄'],
'income' : [4.5, 2.9, 3.8, 3.7, 4.0, 4.1, 1.9, 4.1, 3.2],
'expenditure' : [1.5, 1.9, 2.8, 1.7, 4.1, 2.5, 1.1, 3.4, 1.2]
})
#根據其中一列分組
df_expenditure_mean = df.groupby(['Gender']).mean()

#根據其中兩列分組
df_expenditure_mean = df.groupby(['Gender', 'name']).mean()

#只對其中一列求均值
df_expenditure_mean = df.groupby(['Gender', 'name'])['income'].mean()
輸出示例:

 

 
所見 2 :解決groupby.sum() 后層級索引levels上移的問題
上圖中的輸出二,雖然是 DataFrame 的格式,但是若需要與其他表匹配的時候,這個格式就有些麻煩了。匹配數據時,我們需要的數據格式是:列名都在第一行,數據行中也不能有 Gender 列這樣的合並單元格。因此,我們需要做一些調整,將 as_index 改為 False ,默認是 Ture 。

#不以組標簽為索引,通過 as_index 來實現
df_expenditure_mean = df.groupby(['Gender', 'name'], as_index=False).mean()
輸出:

 

所見 3 :解決groupby.apply() 后層級索引levels上移的問題
在所見 2 中我們知道,使用參數 as_index 就可使 groupby 的結果不以組標簽為索引,但是后來在使用 groupby.apply() 時發現,as_index 參數失去了效果。如下例所示:

# 使用了 as_index=False,但是從輸出結果中可見沒起到作用
df_apply = df.groupby(['Gender', 'name'], as_index=False).apply(lambda x: sum(x['income']-x['expenditure'])/sum(x['income']))
df_apply = pd.DataFrame(df_apply,columns=['存錢占比'])#轉化成dataframe格式
輸出:

 

解決辦法: 加一句df_apply_index = df_apply.reset_index()

# 加一句df_apply_index = df_apply.reset_index()
df_apply = df.groupby(['Gender', 'name'], as_index=False).apply(lambda x: sum(x['income']-x['expenditure'])/sum(x['income']))
df_apply = pd.DataFrame(df_apply,columns=['存錢占比'])#轉化成dataframe格式
df_apply_index = df_apply.reset_index()
輸出:

 

 

所見 4 :groupby函數的分組結果保存成DataFrame
所見 1 中的輸出三,明顯是  Series ,我們需要將其轉化為 DataFrame 格式的數據。

#只對其中一列求均值,並轉化為 DataFrame
df_expenditure_mean = df.groupby(['Gender', 'name'], as_index=False)['income'].mean()
df_expenditure_mean = pd.DataFrame(df_expenditure_mean)#轉化成dataframe格式
df_expenditure_mean.rename(columns={'income':'收入均值'}, inplace = True)
輸出:

 

 

 

下班啦,明天繼續!
————————————————
版權聲明:本文為CSDN博主「黃大俠aa」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_40683253/article/details/86717630


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM