寫在前面:之前我對于groupby一直都小看了,而且感覺了解得不徹底,雖然在另外一篇文章中也提到groupby的用法,但是這篇文章想着重地分析一下,并能從自己的角度分析一下groupby這個好東西~
OUTLINE
- 根據表本身的某一列或多列内容進行分組聚合
- 通過字典或者Series進行分組
根據表本身的某一列或多列内容進行分組聚合
這個是groupby的最常見操作,根據某一列的内容分為不同的次元進行拆解,将同一次元的再進行聚合
- 按一列進行聚合
import pandas as pd
import numpy as np
df = pd.DataFrame({'key1':list('aabba'),
'key2': ['one','two','one','two','one'],
'data1': np.random.randn(),
'data2': np.random.randn()})
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXzUERPRTRq5UeNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zNwYzMzAzMwITNwYDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
for i in df.groupby('key1'):
print(i)
# 輸出:
('a', data1 data2 key1 key2
- a one
a two
- a one)
('b', data1 data2 key1 key2
- b one
- - b two)
- 按多列進行聚合,則看的是多列之間次元的笛卡爾積
比如按照key1列,可以分為a和b兩個次元,按照key2列可以分為one和two兩個次元,最後groupby這兩列之後的結果就是四個group。
for i in df.groupby(['key1','key2']):
print(i)
# 輸出:
(('a', 'one'), data1 data2 key1 key2
- a one
- a one)
(('a', 'two'), data1 data2 key1 key2
a two)
(('b', 'one'), data1 data2 key1 key2
- b one)
(('b', 'two'), data1 data2 key1 key2
- - b two)
通過字典或者Series進行分組
問題情境:一共有5個同學分别對5樣東西做了一個評價,0-5表示對該物品的喜愛程度,随着數值的升高,程度也在不斷加深。
import pandas as pd
import numpy as np
import random
people=pd.DataFrame(
np.random.randint(low=,high=,size=(,)),
columns=['香蕉','蘋果','橘子','眼影','眼線'],
index=['Joe','Steve','Wes','Jim','Travis']
)
但是可以明顯發現這五樣物品可以分為兩類:“水果”和“化妝品”。
問題:我想知道這五名同學對水果和化妝品的平均喜愛程度是什麼樣的?
solution1:通過字典分組
mapping = {'香蕉':'水果','蘋果':'水果','橘子':'水果','眼影':'化妝品','眼線':'化妝品'}
data = people.groupby(mapping,axis=).mean()
solution2:通過Series分組
mapping2 = pd.Series(mapping)
# mapping2
橘子 水果
眼影 化妝品
眼線 化妝品
蘋果 水果
香蕉 水果
dtype: object
之後将Series傳入
data2 = people.groupby(mapping2,axis=).mean()
無論solution1還是2,本質上,都是找index(Series)或者key(字典)與資料表本身的行或者列之間的對應關系,在groupby之後所使用的聚合函數都是對每個group的操作,聚合函數操作完之後,再将其合并到一個DataFrame中,每一個group最後都變成了一列(或者一行)。
另外一個我容易忽略的點就是,在groupby之後,可以接很多很有意思的函數,apply/transform/其他統計函數等等,都要用起來!
彩蛋~
意外發現這兩種不同的文法格式在jupyter notebook上結果是一樣的,但是形式有些微差別
df.groupby(['key1','key2'])[['data2']].mean()
df.groupby(['key1','key2'])['data2'].mean()