1. 程式人生 > 程式設計 >pandas分組聚合詳解

pandas分組聚合詳解

一 前言

pandas學到分組迭代,那麼基礎的pandas系列就學的差不多了,自我感覺不錯,知識追尋者用pandas處理過一些資料,蠻好用的;

知識追尋者(Inheriting the spirit of open source,Spreading technology knowledge;)

二 分組

2.1 資料準備

# -*- 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 列,根據hobby列進行分組,最後對分好組的資料進行處理求均值;

# 是個生成器
group = frame['price'].groupby(frame['hobby'])
# 求均值
print(group.mean())

輸出

hobby
hiking -0.850792
reading 0.880178
running -1.410682
Name: price,dtype: float64

Tip: 可以理解為 根據愛好分組,查詢價格;查詢的列必須是數字,否則求均值時會報異常

如果是根據多列分組則在groupby後面使用列表指定,並且呼叫求均值函式;輸出的值將是分組列,均值結果;

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進行分組,則不再需要提取指定的列;

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: 求均值後,預設是對數字型別的資料進行分組求均值;非數字列自動忽略

2.3 分組求數量

分組求數量是統計分析中應用最為廣泛的函式;如下示例中對DataFrame根據hobby分組,並且呼叫 size()函式統計個數;此方法常用的統計技巧;

group = frame.groupby(frame['hobby'])
print(group.size())

輸出

hobby
hiking 2
reading 2
running 1
dtype: int64

2.4 分組迭代

當對groupby的列只有單個時(示例根據hobby進行分組),可以 使用 key,value 形式 對分組後的資料進行迭代,其中key 是分組的名稱,value是分組的資料;

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

當對多個列進行分組迭代時,有多少列則需要指定多少個key與其對應,key可以是任何不重複的變數名稱

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 分組資料轉為字典

可以對分組後的資料轉為字典;

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進行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','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: 本質上都是陣列,除了Series,還可以使用字典,列表,陣列,函式作為分組列

2.6 通過索引層級分組

傳入級別的名稱即可實現層級化索引分組

# 建立2個列,並且指定名稱
columns = pd.MultiIndex.from_arrays([['Python','Java','Python','Python'],['a','b','a','c']],names=['language','alpha'])
frame = pd.DataFrame(np.random.randint(1,10,(5,5)),columns=columns)
print(frame)

# 根據language進行分組
print(frame.groupby(level='language',axis=1).sum())
# 根據index進行分組
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

到此這篇關於pandas分組聚合詳解的文章就介紹到這了,更多相關pandas 分組聚合內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!