歡迎您光臨本站 註冊首頁

DataFrame.groupby()所見的各種用法詳解

←手機掃碼閱讀     zmcjlove @ 2020-06-15 , reply:0

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)

 

輸出:



[zmcjlove ] DataFrame.groupby()所見的各種用法詳解已經有259次圍觀

http://coctec.com/docs/program/show-post-238610.html