一、groupby 能做什麼?
python中groupby函數主要的作用是進行資料的分組以及分組後地組内運算!
對于資料的分組和分組運算主要是指groupby函數的應用,具體函數的規則如下:
df[](指輸出資料的結果屬性名稱).groupby([df[屬性],df[屬性])(指分類的屬性,資料的限定定語,可以有多個).mean()(對于資料的計算方式——函數名稱)
舉例如下:
print(df["評分"].groupby([df["地區"],df["類型"]]).mean())
#上面語句的功能是輸出表格所有資料中不同地區不同類型的評分資料平均值
二、單類分組
A.groupby("性别")

首先,我們有一個變量A,資料類型是DataFrame
想要按照【性别】進行分組
得到的結果是一個Groupby對象,還沒有進行任何的運算。
describe()
描述組内資料的基本統計量
A.groupby("性别").describe().unstack()
* 隻有數字類型的列資料才會計算統計
* 示例裡面數字類型的資料有兩列 【班級】和【身高】
但是,我們并不需要統計班級的均值等資訊,隻需要【身高】,是以做一下小的改動:
A.groupby("性别")["身高"].describe().unstack()
unstack()
索引重排
上面的例子裡面用到了一個小的技巧,讓運算結果更便于對比檢視,感興趣的同學可以自行去除unstack,比較一下顯示的效果
三、多類分組
A.groupby( ["班級","性别"])
單獨用groupby,我們得到的還是一個 Groupby 對象。
mean()
組内均值計算
DataFrame的很多函數可以直接運用到Groupby對象上。
上圖截自 pandas 官網 document,這裡就不一一細說。
我們還可以一次運用多個函數計算
A.groupby( ["班級","性别"]).agg([np.sum, np.mean, np.std]) # 一次計算了三個
agg()
分組多個運算
四、時間分組
時間序列可以直接作為index,或者有一列是時間序列,差别不是很大。
這裡僅僅示範,某一列為時間序列。
為A 新增一列【生日】,由于分隔符 “/” 的問題,我們檢視列屬性,【生日】的屬性并不是日期類型
我們想做的是:
1、按照【生日】的【年份】進行分組,看看有多少人是同齡?
A["生日"] = pd.to_datetime(A["生日"],format ="%Y/%m/%d") # 轉化為時間格式
A.groupby(A["生日"].apply(lambda x:x.year)).count() # 按照【生日】的【年份】分組
進一步,我們想選拔:
2、同一年作為一個小組,小組内生日靠前的那一位作為小隊長:
A.sort_values("生日", inplace=True) # 按時間排序
A.groupby(A["生日"].apply(lambda x:x.year),as_index=False).first()
as_index=False
保持原來的資料索引結果不變
first()
保留第一個資料
Tail(n=1)
保留最後n個資料
再進一步:
3、想要找到哪個月隻有一個人過生日
A.groupby(A["生日"].apply(lambda x:x.month),as_index=False) # 到這裡是按月分組
A.groupby(A["生日"].apply(lambda x:x.month),as_index=False).filter(lambda x: len(x)==1)
filter()
對分組進行過濾,保留滿足()條件的分組
以上就是 groupby 最經常用到的功能了。
用 first(),tail()截取每組前後幾個資料
用 apply()對每組進行(自定義)函數運算
用 filter()選取滿足特定條件的分組