Python中的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(5),
'data2': np.random.randn(5)})
for i upby('key1'):
print(i)
# 输出:
('a',      data1    data2 key1 key2
0 -0.293828  0.571930    a  one
1  1.872765  1.085445    a  two
4 -1.943001  0.106842    a  one)
('b',      data1    data2 key1 key2
2 -0.466504  1.262140    b  one
3 -1.125619 -0.836119    b  two)
按多列进⾏聚合,则看的是多列之间维度的笛卡尔积
⽐如按照key1列,可以分为a和b两个维度,按照key2列可以分为one和two两个维度,最后groupby这两列之后的结果就是四个group。
for i upby(['key1','key2']):
print(i)
# 输出:
(('a', 'one'),      data1    data2 key1 key2
0 -0.293828  0.571930    a  one
4 -1.943001  0.106842    a  one)
(('a', 'two'),      data1    data2 key1 key2
1  1.872765  1.085445    a  two)
(('b', 'one'),      data1    data2 key1 key2
2 -0.466504  1.26214    b  one)
(('b', 'two'),      data1    data2 key1 key2
3 -1.125619 -0.836119    b  two)
通过字典或者Series进⾏分组
问题情境:⼀共有5个同学分别对5样东西做了⼀个评价,0-5表⽰对该物品的喜爱程度,随着数值的升⾼,程度也在不断加深。
import pandas as pd
import numpy as np
import random
people=pd.DataFrame(
np.random.randint(low=0,high=6,size=(5,5)),
columns=['⾹蕉','苹果','橘⼦','眼影','眼线'],
index=['Joe','Steve','Wes','Jim','Travis']
)
但是可以明显发现这五样物品可以分为两类:“⽔果”和“化妆品”。
groupby分组问题:我想知道这五名同学对⽔果和化妆品的平均喜爱程度是什么样的?
solution1:通过字典分组
mapping = {'⾹蕉':'⽔果','苹果':'⽔果','橘⼦':'⽔果','眼影':'化妆品','眼线':'化妆品'}
data = upby(mapping,axis=1).mean()
solution2:通过Series分组
mapping2 = pd.Series(mapping)
# mapping2
橘⼦⽔果
眼影化妆品
眼线化妆品
苹果⽔果
⾹蕉⽔果
dtype: object
之后将Series传⼊
data2 = upby(mapping2,axis=1).mean()
⽆论solution1还是2,本质上,都是index(Series)或者key(字典)与数据表本⾝的⾏或者列之间的对应关系,在groupby之后所使⽤的聚合函数都是对每个group的操作,聚合函数操作完之后,再将其合并到⼀个DataFrame中,每⼀个group最后都变成了⼀列(或者⼀⾏)。
另外⼀个我容易忽略的点就是,在groupby之后,可以接很多很有意思的函数,apply/transform/其他统计函数等等,都要⽤起来!
彩蛋~
意外发现这两种不同的语法格式在jupyter notebook上结果是⼀样的,但是形式有些微区别

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。