pandas分組聚合詳解
一 前言
pandas學(xué)到分組迭代,那么基礎(chǔ)的pandas系列就學(xué)的差不多了,自我感覺不錯,知識追尋者用pandas處理過一些數(shù)據(jù),蠻好用的;
知識追尋者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 分組
2.1 數(shù)據(jù)準(zhǔn)備
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
frame = pd.DataFrame({
'user' : ['zszxz','craler','rose','zszxz','rose'],
'hobby' : ['reading','running','hiking','reading','hiking'],
'price' : np.random.randn(5),
'number' : np.random.randn(5)
})
print(frame)
輸出
user hobby price number
0 zszxz reading 0.275752 -0.075841
1 craler running -1.410682 0.259869
2 rose hiking -0.353269 -0.392659
3 zszxz reading 1.484604 0.659274
4 rose hiking -1.348315 2.492047
2.2 分組求均值
提取DataFrame中price 列,根據(jù)hobby列進(jìn)行分組,最后對分好組的數(shù)據(jù)進(jìn)行處理求均值;
# 是個生成器 group = frame['price'].groupby(frame['hobby']) # 求均值 print(group.mean())
輸出
hobby
hiking -0.850792
reading 0.880178
running -1.410682
Name: price, dtype: float64
Tip: 可以理解為 根據(jù)愛好分組,查詢價格;查詢的列必須是數(shù)字,否則求均值時會報異常
如果是根據(jù)多列分組則在groupby后面使用列表指定,并且調(diào)用求均值函數(shù);輸出的值將是分組列,均值結(jié)果;
group = frame['price'].groupby([frame['hobby'],frame['user']]) print(group.mean())
輸出
hobby user
hiking rose 0.063972
reading zszxz 0.393164
running craler -1.395186
Name: price, dtype: float64
如果對整個DataFrame進(jìn)行分組,則不再需要提取指定的列;
group = frame.groupby(frame['hobby']) print(group.mean())
輸出
hobby
hiking -0.116659 -0.316222
reading -0.651365 0.856299
running -0.282676 -0.585124
Tip: 求均值后,默認(rèn)是對數(shù)字類型的數(shù)據(jù)進(jìn)行分組求均值;非數(shù)字列自動忽略
2.3 分組求數(shù)量
分組求數(shù)量是統(tǒng)計分析中應(yīng)用最為廣泛的函數(shù);如下示例中對DataFrame根據(jù)hobby分組,并且調(diào)用 size()函數(shù)統(tǒng)計個數(shù);此方法常用的統(tǒng)計技巧;
group = frame.groupby(frame['hobby']) print(group.size())
輸出
hobby
hiking 2
reading 2
running 1
dtype: int64
2.4 分組迭代
當(dāng)對groupby的列只有單個時(示例根據(jù)hobby進(jìn)行分組),可以 使用 key , value 形式 對分組后的數(shù)據(jù)進(jìn)行迭代,其中key 是分組的名稱,value是分組的數(shù)據(jù);
group = frame['price'].groupby(frame['hobby']) for key , data in group: print(key) print(data)
輸出
hiking
2 -0.669410
4 -0.246816
Name: price, dtype: float64
reading
0 1.362191
3 -0.052538
Name: price, dtype: float64
running
1 0.8963
Name: price, dtype: float64
當(dāng)對多個列進(jìn)行分組迭代時,有多少列則需要指定多少個key與其對應(yīng),key可以是任何不重復(fù)的變量名稱
group = frame['price'].groupby([frame['hobby'],frame['user']]) for (key1, key2) , data in group: print(key1,key2) print(data)
輸出
hiking rose
2 -0.019423
4 -2.642912
Name: price, dtype: float64
reading zszxz
0 0.405016
3 0.422182
Name: price, dtype: float64
running craler
1 -0.724752
Name: price, dtype: float64
2.5 分組數(shù)據(jù)轉(zhuǎn)為字典
可以對分組后的數(shù)據(jù)轉(zhuǎn)為字典;
dic = dict(list(frame.groupby(frame['hobby']))) print(dic)
輸出
{'hiking': user hobby price number
2 rose hiking 0.351633 0.523272
4 rose hiking 0.800039 0.331646,
'reading': user hobby price number
0 zszxz reading -0.074857 -0.928798
3 zszxz reading 0.666925 0.606706,
'running': user hobby price number
1 craler running -2.525633 0.895776}
獲取key
print(dic['hiking'])
輸出
user hobby price number
2 rose hiking 0.382225 -0.242055
4 rose hiking 1.055785 -0.328943
2.6 分組取值
對frame進(jìn)行hobby分組,就算查詢 price 的均值;返回Series;
mean = frame.groupby('hobby')['price'].mean()
print(type(mean))
print(mean)
輸出
<class 'pandas.core.series.Series'>
hobby
hiking 0.973211
reading -1.393790
running -0.286236
Name: price, dtype: float64
Tip: frame.groupby(‘hobby')[‘price'] 與 frame[‘price'] .groupby(frame[‘hobby']) 相等
如果想要返回 DataFrame
mean = frame.groupby('hobby')[['price']].mean()
print(type(mean))
print(mean)
輸出
<class 'pandas.core.frame.DataFrame'>
price
hobby
hiking 0.973211
reading -1.393790
running -0.286236
2.5 Series作為分組
也可以傳入Series作為DataFrame的分組列
ser = pd.Series(['hiking','reading','running']) data = frame.groupby(ser).mean() print(data)
輸出
price number
hiking 1.233396 0.313839
reading -0.298887 0.982853
running -0.797734 -1.230811
Tip: 本質(zhì)上都是數(shù)組,除了Series,還可以使用字典,列表,數(shù)組,函數(shù)作為分組列
2.6 通過索引層級分組
傳入級別的名稱即可實現(xiàn)層級化索引分組
# 創(chuàng)建2個列,并且指定名稱
columns = pd.MultiIndex.from_arrays([['Python', 'Java', 'Python', 'Java', 'Python'],
['a', 'b', 'a', 'b', 'c']], names=['language', 'alpha'])
frame = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
print(frame)
# 根據(jù)language進(jìn)行分組
print(frame.groupby(level='language', axis=1).sum())
# 根據(jù)index進(jìn)行分組
print(frame.groupby(level='alpha', axis=1).sum())
frame輸出如下
language Python Java Python Java Python
alpha a b a b c
0 9 9 7 4 5
1 3 4 7 6 6
2 6 6 3 9 1
3 1 1 8 5 2
4 6 5 9 5 4
language分組如下
language Java Python
0 13 21
1 10 16
2 15 10
3 6 11
4 10 19
alpha分組如下
alpha a b c
0 16 13 5
1 10 10 6
2 9 15 1
3 9 6 2
4 15 10 4
到此這篇關(guān)于pandas分組聚合詳解的文章就介紹到這了,更多相關(guān)pandas 分組聚合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基本數(shù)據(jù)類型及內(nèi)置方法
這篇文章主要介紹了Python基本數(shù)據(jù)類型及內(nèi)置方法,??數(shù)據(jù)類型是用來記錄事物狀態(tài)的,而事物的狀態(tài)是不斷變化的,下文圍繞主題展開相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-04-04
pycharm遠(yuǎn)程連接服務(wù)器調(diào)試tensorflow無法加載問題
最近打算在win系統(tǒng)下使用pycharm開發(fā)程序,并遠(yuǎn)程連接服務(wù)器調(diào)試程序,其中在import tensorflow時報錯,本文就來介紹一下如何解決,感興趣的可以了解一下2021-06-06

