pandas數據分組groupby()和統計函數agg()的使用
數據分組
- 使用
groupby()
方法進行分組 - group.
size()
查看分組後每組的數量 - group.
groups
查看分組情況 - group.
get_group('名字')
根據分組後的名字選擇分組數據
準備數據
# 一個Series其實就是一條數據,Series方法的第一個參數是data,第二個參數是index(索引),如果沒有傳值會使用默認值(0-N) # index參數是我們自定義的索引值,註意:參數值的個數一定要相同。 # 在創建Series時數據並不一定要是列表,也可以將一個字典傳進去。 from pandas import Series, DataFrame # 使用字典創建 index_list = ['001', '002', '003', '004', '005', '006', '007', '008', '009', '010'] name_list = ['李白', '王昭君', '諸葛亮', '狄仁傑', '孫尚香', '妲己', '周瑜', '張飛', '王昭君', '大喬'] age_list = [25, 28, 27, 25, 30, 29, 25, 32, 28, 26] gender_list = ['F', 'M', 'F', 'F', 'M', 'M', 'F', 'F', 'M', 'M'] salary_list = ['10k', '12.5k', '20k', '14k', '12k', '17k', '18k', '21k', '22k', '21.5k'] marital_list = ['NO', 'NO', 'YES', 'YES', 'NO', 'NO', 'NO', 'YES', 'NO', 'YES'] dic = { '姓名': Series(data=name_list, index=index_list), '年齡': Series(data=age_list, index=index_list), '薪資': Series(data=salary_list, index=index_list), '性別': Series(data=gender_list, index=index_list), '婚姻狀況': Series(data=marital_list, index=index_list) } df = DataFrame(dic) # 寫入csv,path_or_buf為寫入文本文件 df.to_csv(path_or_buf='./People.csv', encoding='utf_8_sig') print('end')
上面代碼會在當前目錄下生成一個 People.csv
文件
import pandas as pd df = pd.read_csv('./People.csv') df.head()
# 根據 '性別列' 進行分組, 得到的是一個分組後的對象 groups = df.groupby('性別') print(groups)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002953DAEBC88>
size()
使用groupby的size方法可以查看分組後每組的數量, 並返回一個含有分組大小的Series
print(groups.size())
性別 F 5 M 5 dtype: int64
可以隻對一列數據進行分組, 隻保留想要的數據
例如: 通過性別, 隻對年齡進行分組
group = df['年齡'].groupby(df['性別']) # 查看分組 print(group.groups) # 根據分組後的名字選擇分組 print(group.get_group('F'))
{'F': Int64Index([0, 2, 3, 6, 7], dtype='int64'), 'M': Int64Index([1, 4, 5, 8, 9], dtype='int64')} 0 25 2 27 3 25 6 25 7 32 Name: 年齡, dtype: int64
- 代碼
df['年齡'].groupby(df['性別'])
的邏輯是:取出df中’年齡’列數據,並且對該列數據根據df[‘性別’]列數據進行分組操作 - 這個代碼也可寫成
df.groupby(df['性別'])['年齡']
, 他的邏輯是: 將df數據通過df[‘性別’]進行分組,然後再取出分組後的’年齡’列數據。兩種寫法達到的效果是一樣的 group.groups
的結果是一個字典,字典的key是分組後每個組的名字,對應的值是分組後的數據,此方法方便我們產看分組的情況group.get_group('F')
這個方法可以根據具體分組的名字獲取,每個組的數據
對分組進行遍歷
import pandas as pd df = pd.read_csv('./People.csv') groups = df.groupby('性別') # print(groups) for group_name,group_df in groups: print('分組的名稱:', group_name, '分組的數據', group_df.shape) print('-'*10)
分組的名稱: F 分組的數據 (5, 6)
———-
分組的名稱: M 分組的數據 (5, 6)
———-
– 將分組後的對象groups進行遍歷,可以獲取到group_name每個組的名字,group_df每個組的數據
import pandas as pd df = pd.read_csv('./People.csv') groups = df.groupby('性別') for group_name,group_df in groups: f_mean = group_df['年齡'].mean() f_max = group_df['年齡'].max() f_min = group_df['年齡'].min() print('{}組的最大年齡是{},最小年齡是{},平均年齡是{}'.format(group_name,f_max,f_min,f_mean))
F組的最大年齡是32,最小年齡是25,平均年齡是26.8
M組的最大年齡是30,最小年齡是26,平均年齡是28.2
按多列進行分組
當需要按照多列進行分組的時候, groupby 方法裡面我們傳入一個列表, 列表分別存儲分組依據的列名
註意: 列表中列名的順序, 確定瞭先按XXXX列分組, 然後在按照YYYY列分組, 不同的順序產生的分組名字是不同的
df = pd.read_csv('./People.csv') group=df.groupby(['性別', '婚姻狀況']) df1 = group.size() print(df1)
性別 婚姻狀況 F NO 2 YES 3 M NO 4 YES 1 dtype: int64
group.size()返回的結果中發現索引值是多層的, 所以對於多索引值的獲取, 隻需要從外往裡一層一層的取就可以啦, 就像我們睡覺之前,需要先脫外衣再脫掉內衣是一樣的
size = df1['F'][ 'NO'] print(size)
2
pandas 常用統計函數
count()
統計列表中非空手機開的個數nunique()
統計非重復的數據個數sum()
統計列表中所有數值的和mean()
計算列表中數據的平均值median()
統計列表中數據中位數max()
求列表中數據的最大值min()
求列表中數據的最小值
對分組後的數據進行統計 agg()
import pandas as pd df = pd.read_csv('./People.csv') groups = df.groupby('性別') for group_name,group_df in groups: f_se = group_df['年齡'].agg(['max','min','mean']) print('{}組的最大年齡是{},最小年齡是{},平均年齡是{}'.format(group_name,f_se[0],f_se[1],f_se[2]))
F組的最大年齡是32.0,最小年齡是25.0,平均年齡是26.8
M組的最大年齡是30.0,最小年齡是26.0,平均年齡是28.2
- 在使用
agg()
函數時, 我們可以將多個統計函數一起放在一個 agg() 函數中 - 如果是統計函數是pandas 提供的, 隻需要將函數名字以字符串的形式存儲到列表中即可
- 例如: 將 max() 改成 ‘max’
自定義統計函數
當使用自定義的統計函數時
先創建統計函數
# 自定義的統計函數 def my_peak_range(df): """ 返回最大值與最小之間的范圍 """ return df.max() - df.min() # 使用 for group_name,group_df in groups: f_se = group_df['年齡'].agg(['max','min','mean',my_peak_range]) print(f_se[0],f_se[1],f_se[3])
32.0 25.0 7.0 30.0 26.0 4.0
註意: 自定義函數名字傳入agg()
函數時, 不需要轉換成字符串
補充: 在這個數據中, 性別是什麼的人總年齡最高
import pandas as pd df = pd.read_csv('./People.csv') groups = df.groupby('性別') gende=groups.sum().sort_values(by='年齡',ascending=False).index.to_list()[0] """ 這行代碼, 先按性別進行分組, 然後吧每組中的數據求和得到總的年齡, 在按照年齡排序 再取出index,最後使用to_list()轉換為列表,取出第一個數據 """ print(gende)
M
開始按照性別分組, 組量太少, 數據也比較少, 本來準備算薪資總數, 但是單位忘記換瞭, 就這樣吧
到此這篇關於pandas數據分組groupby()和統計函數agg()的使用的文章就介紹到這瞭,更多相關pandas groupby()和agg()內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Pandas高級教程之Pandas中的GroupBy操作
- pandas中groupby操作實現
- Python groupby函數圖文詳解
- Python Pandas教程之series 上的轉換操作
- python數學建模之三大模型與十大常用算法詳情