pandas之分组groupby()的使⽤整理与总结
前⾔
在使⽤pandas的时候,有些场景需要对数据内部进⾏分组处理,如⼀组全校学⽣成绩的数据,我们想通过班级进⾏分组,或者再对班级分组后的性别进⾏分组来进⾏分析,这时通过pandas下的groupby()函数就可以解决。在使⽤pandas进⾏数据分析时,groupby()函数将会是⼀个数据分析辅助的利器。
groupby的作⽤可以参考超好⽤的 pandas 之 groupby 中作者的插图进⾏直观的理解:
准备
读⼊的数据是⼀段学⽣信息的数据,下⾯将以这个数据为例进⾏整理grouby()函数的使⽤:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('./data.csv')
print(df)
Name Gender Age Score
0 Alen Male 18 80
1 Bob Male 19 90
2 Cidy Female 18 93
3 Daniel Male 20 87
4 Ellen Female 17 96
5 Frankie Male 21 100
6 Gate Male 20 88
7 Hebe Female 22 98
基本操作
在进⾏对groupby函数进⾏学习之前,⾸先需要明确的是,通过对DataFrame对象调⽤groupby()函数返回的结果是⼀个DataFrameGroupBy对象,⽽不是⼀个DataFrame或者Series对象,所以,它们中的⼀些⽅法或者函数是⽆法直接调⽤的,需要按照GroupBy对象中具有的函数和⽅法进⾏调⽤。
grouped = df.groupby('Gender')
print(type(grouped))
print(grouped)
<class 'upby.DataFrameGroupBy'>
分组时,不仅仅可以指定⼀个列名,也可以指定多个列名:
grouped = df.groupby('Gender')
grouped_muti = df.groupby(['Gender', 'Age'])
print(grouped.size())
print(grouped_muti.size())
Gender
Female 3
Male 5
dtype: int64
Gender Age
Female 17 1
18 1
22 1groupby分组
Male 18 1
19 1
20 2
21 1
dtype: int64
指定多个列名个单个列名后的区别在于,分组的主键或者索引(indice)将⼀个是单个主键,另⼀个则是⼀个元组的形式:
_group('Female'))
print(_group(('Female', 17)))
Name Gender Age Score
2 Cidy Female 18 93
4 Ellen Female 17 96
7 Hebe Female 22 98
Name Gender Age Score
4 Ellen Female 17 96
通过调⽤get_group()函数可以返回⼀个按照分组得到的DataFrame对象,所以接下来的使⽤就可以按照·DataFrame·对象来使⽤。如果想让这个DataFrame对象的索引重新定义可以通过:
df = _group('Female').reset_index()
print(df)
index Name Gender Age Score
0 2 Cidy Female 18 93
1 4 Ellen Female 17 96
2 7 Hebe Female 22 98
这⾥可以总结⼀下,由于通过groupby()函数分组得到的是⼀个DataFrameGroupBy对象,⽽通过对这个对象调⽤get_group(),返回的则是⼀个·DataFrame·对象,所以可以将DataFrameGroupBy对象理解为是多
个DataFrame组成的。
⽽没有调⽤get_group()函数之前,此时的数据结构任然是DataFrameGroupBy,此时进⾏对DataFrameGroupBy按照列名进⾏索引,同理就可以得到SeriesGroupBy对象,取多个列名,则得到的任然
是DataFrameGroupBy对象,这⾥可以类⽐DataFrame和Series的关系。
按照上⾯的思路理解后,再调⽤get_group()函数后得到的DataFrame对象按照列名进⾏索引实际上就是得到了Series的对象,下⾯的操作就可以按照Series对象中的函数⾏了。
在没有进⾏调⽤get_group(),也就是没有取出特定某⼀组数据之前,此时的数据结构任然是DataFram
eGroupBy,其中也有很多函数和⽅法可以调⽤,如max()、count()、std()等,返回的结果是⼀个DataFrame对象。
unt())
print(grouped.max()[['Age', 'Score']])
an()[['Age', 'Score']])
Name Age Score
Gender
Female 3 3 3
Male 5 5 5
Age Score
Gender
Female 22 98
Male 21 100
Age Score
Gender
Female 19.0 95.666667
Male 19.6 89.000000
如果其中的函数⽆法满⾜你的需求,你也可以选择使⽤聚合函数aggregate,传递numpy或者⾃定义的函数,前提是返回⼀个聚合值。
def getSum(data):
total = 0
for d in data:
total+=d
return total
print(grouped.dian))
print(grouped.aggregate({'Age':np.median, 'Score':np.sum}))
print(grouped.aggregate({'Age':getSum}))
aggregate函数不同于apply,前者是对所有的数值进⾏⼀个聚合的操作,⽽后者则是对每个数值进⾏单独的⼀个操作:
def addOne(data):
return data + 1
df['Age'] = df['Age'].apply(addOne)
df['Age'] = df['Age'].apply(int)
可视化操作
对组内的数据绘制概率密度分布:
grouped['Age'].plot(kind='kde', legend=True)
plt.show()
由于grouped['Age']是⼀个SeriesGroupby对象, 顾名思义, 就是每⼀个组都有⼀个Series. 所以直接plot相当于遍历了每⼀个组内的Age数据。
REF
到此这篇关于pandas之分组groupby()的使⽤整理与总结的⽂章就介绍到这了,更多相关pandas groupby()分组内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论