pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用
數(shù)據(jù)分組
- 使用
groupby()
方法進(jìn)行分組 - group.
size()
查看分組后每組的數(shù)量 - group.
groups
查看分組情況 - group.
get_group('名字')
根據(jù)分組后的名字選擇分組數(shù)據(jù)
準(zhǔn)備數(shù)據(jù)
# 一個(gè)Series其實(shí)就是一條數(shù)據(jù),Series方法的第一個(gè)參數(shù)是data,第二個(gè)參數(shù)是index(索引),如果沒(méi)有傳值會(huì)使用默認(rèn)值(0-N) # index參數(shù)是我們自定義的索引值,注意:參數(shù)值的個(gè)數(shù)一定要相同。 # 在創(chuàng)建Series時(shí)數(shù)據(jù)并不一定要是列表,也可以將一個(gè)字典傳進(jìn)去。 from pandas import Series, DataFrame # 使用字典創(chuàng)建 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) # 寫(xiě)入csv,path_or_buf為寫(xiě)入文本文件 df.to_csv(path_or_buf='./People.csv', encoding='utf_8_sig') print('end')
上面代碼會(huì)在當(dāng)前目錄下生成一個(gè) People.csv
文件
import pandas as pd df = pd.read_csv('./People.csv') df.head()
# 根據(jù) '性別列' 進(jìn)行分組, 得到的是一個(gè)分組后的對(duì)象 groups = df.groupby('性別') print(groups)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002953DAEBC88>
size()
使用groupby的size方法可以查看分組后每組的數(shù)量, 并返回一個(gè)含有分組大小的Series
print(groups.size())
性別 F 5 M 5 dtype: int64
可以只對(duì)一列數(shù)據(jù)進(jìn)行分組, 只保留想要的數(shù)據(jù)
例如: 通過(guò)性別, 只對(duì)年齡進(jìn)行分組
group = df['年齡'].groupby(df['性別']) # 查看分組 print(group.groups) # 根據(jù)分組后的名字選擇分組 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中'年齡'列數(shù)據(jù),并且對(duì)該列數(shù)據(jù)根據(jù)df[‘性別']列數(shù)據(jù)進(jìn)行分組操作 - 這個(gè)代碼也可寫(xiě)成
df.groupby(df['性別'])['年齡']
, 他的邏輯是: 將df數(shù)據(jù)通過(guò)df[‘性別']進(jìn)行分組,然后再取出分組后的'年齡'列數(shù)據(jù)。兩種寫(xiě)法達(dá)到的效果是一樣的 group.groups
的結(jié)果是一個(gè)字典,字典的key是分組后每個(gè)組的名字,對(duì)應(yīng)的值是分組后的數(shù)據(jù),此方法方便我們產(chǎn)看分組的情況group.get_group('F')
這個(gè)方法可以根據(jù)具體分組的名字獲取,每個(gè)組的數(shù)據(jù)
對(duì)分組進(jìn)行遍歷
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, '分組的數(shù)據(jù)', group_df.shape) print('-'*10)
分組的名稱: F 分組的數(shù)據(jù) (5, 6)
----------
分組的名稱: M 分組的數(shù)據(jù) (5, 6)
----------
- 將分組后的對(duì)象groups進(jìn)行遍歷,可以獲取到group_name每個(gè)組的名字,group_df每個(gè)組的數(shù)據(jù)
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
按多列進(jìn)行分組
當(dāng)需要按照多列進(jìn)行分組的時(shí)候, groupby 方法里面我們傳入一個(gè)列表, 列表分別存儲(chǔ)分組依據(jù)的列名
注意: 列表中列名的順序, 確定了先按XXXX列分組, 然后在按照YYYY列分組, 不同的順序產(chǎn)生的分組名字是不同的
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()返回的結(jié)果中發(fā)現(xiàn)索引值是多層的, 所以對(duì)于多索引值的獲取, 只需要從外往里一層一層的取就可以啦, 就像我們睡覺(jué)之前,需要先脫外衣再脫掉內(nèi)衣是一樣的
size = df1['F'][ 'NO'] print(size)
2
pandas 常用統(tǒng)計(jì)函數(shù)
count()
統(tǒng)計(jì)列表中非空手機(jī)開(kāi)的個(gè)數(shù)nunique()
統(tǒng)計(jì)非重復(fù)的數(shù)據(jù)個(gè)數(shù)sum()
統(tǒng)計(jì)列表中所有數(shù)值的和mean()
計(jì)算列表中數(shù)據(jù)的平均值median()
統(tǒng)計(jì)列表中數(shù)據(jù)中位數(shù)max()
求列表中數(shù)據(jù)的最大值min()
求列表中數(shù)據(jù)的最小值
對(duì)分組后的數(shù)據(jù)進(jìn)行統(tǒng)計(jì) 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()
函數(shù)時(shí), 我們可以將多個(gè)統(tǒng)計(jì)函數(shù)一起放在一個(gè) agg() 函數(shù)中 - 如果是統(tǒng)計(jì)函數(shù)是pandas 提供的, 只需要將函數(shù)名字以字符串的形式存儲(chǔ)到列表中即可
- 例如: 將 max() 改成 ‘max'
自定義統(tǒng)計(jì)函數(shù)
當(dāng)使用自定義的統(tǒng)計(jì)函數(shù)時(shí)
先創(chuàng)建統(tǒng)計(jì)函數(shù)
# 自定義的統(tǒng)計(jì)函數(shù) 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
注意: 自定義函數(shù)名字傳入agg()
函數(shù)時(shí), 不需要轉(zhuǎn)換成字符串
補(bǔ)充: 在這個(gè)數(shù)據(jù)中, 性別是什么的人總年齡最高
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] """ 這行代碼, 先按性別進(jìn)行分組, 然后吧每組中的數(shù)據(jù)求和得到總的年齡, 在按照年齡排序 再取出index,最后使用to_list()轉(zhuǎn)換為列表,取出第一個(gè)數(shù)據(jù) """ print(gende)
M
開(kāi)始按照性別分組, 組量太少, 數(shù)據(jù)也比較少, 本來(lái)準(zhǔn)備算薪資總數(shù), 但是單位忘記換了, 就這樣吧
到此這篇關(guān)于pandas數(shù)據(jù)分組groupby()和統(tǒng)計(jì)函數(shù)agg()的使用的文章就介紹到這了,更多相關(guān)pandas groupby()和agg()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Pandas處理測(cè)試數(shù)據(jù)的方法
Pandas是一個(gè)功能極其強(qiáng)大的數(shù)據(jù)分析庫(kù),可以高效地操作各種數(shù)據(jù)集,這篇文章主要介紹了Python自動(dòng)化測(cè)試-使用Pandas來(lái)高效處理測(cè)試數(shù)據(jù),需要的朋友可以參考下2023-02-02Python人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)WGAN示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)WGAN的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11下載安裝好python后想查看python安裝位置的幾種方法
這篇文章主要介紹了在Windows系統(tǒng)中查看Python路徑和版本的幾種方法,并提供了一個(gè)清除命令行窗口的技巧,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03使用Python正則表達(dá)式操作文本數(shù)據(jù)的方法
這篇文章主要介紹了使用Python正則表達(dá)式操作文本數(shù)據(jù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05python常用的時(shí)間模塊之datetime模塊示例詳解
這篇文章主要介紹了python常用的時(shí)間模塊之datetime模塊,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05OpenCV實(shí)現(xiàn)圖片編解碼實(shí)踐
在很多應(yīng)用中,經(jīng)常會(huì)直接把圖片的二進(jìn)制數(shù)據(jù)進(jìn)行交換,這就需要對(duì)普通進(jìn)行編碼解碼,那么怎么才能實(shí)現(xiàn),本文就來(lái)介紹一下2021-06-06只用50行Python代碼爬取網(wǎng)絡(luò)美女高清圖片
第一次寫(xiě)文章,技術(shù)不成熟之處望各位大神輕噴,今天教大家只用50行Python代碼爬取網(wǎng)絡(luò)美女圖片是怎么操作的,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助哦,需要的朋友可以參考下2021-06-06詳解python實(shí)現(xiàn)小波變換的一個(gè)簡(jiǎn)單例子
這篇文章主要介紹了詳解python實(shí)現(xiàn)小波變換的一個(gè)簡(jiǎn)單例子,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07