关于pandas里gruoupby函数的理解
最近在学习pandas库,pandas里面有很多好用的函数,今天来记录以下groupby函数。
数据准备
首先建立演示数据。
import pandas as pd
df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
'Parrot', 'Parrot'],
'Max Speed': [380., 370., 24., 26.],
'age':[20,19,20,10]})
print(df)
输出结果为
groupby函数
groupby(self, by=None, axis=0, level=None, as_index=True, sort=True,
group_keys=True, squeeze=False, observed=False, **kwargs)
- by参数
by参数可传入函数、字典、Series等,这个参数是分类的依据,一般传入离散的类别标签,然后返回DataFrameGroupBy对象,这个对象包含着多个列表,如下图。https://www.jianshu.com/p/42f1d2909bb6来自
例子1(传入1个列名):
list(df.groupby(['Animal']))
输出结果
df.groupby([‘Animal’])的返回值为一个DataFrameGroupBy对象,不可直接查看,利用list函数把它转换为列表,我们可以看到,列表中有两个元组,每个元组里面的’Animal’列都是一样的,说明传入一个参数会把数据按着这列的值进行分割,相当与excel中的筛选。得到DataFrameGroupBy对象后,我们就可以求连续变量的特征值,如平均值、std等。
df.groupby(['Animal'])['age'].mean()
注意,若有多列数据,可用用[‘列名’]进行索引后求值,若需要不同列,则可以通过[[‘列名1’,‘列名2’]]进行索引求值。
df.groupby(['Animal'])[['age','Max Speed']].max()
例子2(传入多个列名)
list(df.groupby(['Animal','age']))
输出结果
如图,输出的标签包括4项,(‘Falcon’, 19)、(‘Falcon’, 20)、(‘Parrot’, 10)、(‘Parrot’, 20),每一项有1行数据,说明传入多个列名的结果就是把这两列的唯一值找出来当做标签分割数据,由于原始数据中’Animal’和’age’的4个组合没有重复项,所以出现了4个标签各一行数据的情况。
例子3(统计离散值数据)
把原始数据加一列离散值便于演示。
df = pd.DataFrame({'Animal': ['Falcon', 'Falcon','Parrot', 'Parrot'],
'Max Speed': [380., 370., 24., 26.],
'age':[20,19,20,10],'exist':[True,False,True,True]})
如果我们要统计不同’Animal’的’exist’情况,我们可以利用如下代码:
df.groupby(['Animal'])['exist'].value_counts()
输出结果
我们可以看到不同’Animal’的’exist’情况,利用unstack()函数还可以把结果展开成DataFrame进行进一步运算。
- level参数
level参数利用pandas官方文档中的数据进行说明。
>>> arrays = [['Falcon', 'Falcon', 'Parrot', 'Parrot'],
... ['Captive', 'Wild', 'Captive', 'Wild']]
>>> index = pd.MultiIndex.from_arrays(arrays, names=('Animal', 'Type'))
>>> df = pd.DataFrame({'Max Speed': [390., 350., 30., 20.]},
... index=index)
>>> df
Max Speed
Animal Type
Falcon Captive 390.0
Wild 350.0
Parrot Captive 30.0
Wild 20.0
>>> df.groupby(level=0).mean()
Max Speed
Animal
Falcon 370.0
Parrot 25.0
>>> df.groupby(level=1).mean()
Max Speed
Type
Captive 210.0
Wild 185.0
很明显,level参数倾向于多标签筛选,利用level进行一级标签或者二级标签的筛选计算。其他参数还没有用到,用到时再回来补充。
groupby函数的可视化操作
1.离散数据分布情况
如果想查看不同’Animal’的’exist’的分布情况,利用groupby函数可以很方便的实现。
df.groupby(['Animal'])['exist'].value_counts().unstack().plot(kind='bar', figsize=(20, 4))
plt.show()
输出结果
数据较少,图比较丑,大概是这个意思。。。
2.连续数据分布情况
如果想查看不同’Animal’的’age’的分布情况
df.groupby(['Animal'])['age'].plot(kind='bar', figsize=(20, 4))
groupby函数的高级操作
如果我要把’age‘标签做sdt、mean,'Max Speed’做mean,可以通过如下代码实现。
df.groupby(['Animal']).agg({'age':[np.sdt,np.mean],'Max Speed':[np.mean]})
输出结果
如果想要改变标签名称,还可通过以下代码实现:
a.columns = ["_".join(i) for i in a.columns.values ]
结语
groupby函数非常灵活,可以很快的统计数据以及可视化,本篇文章很多借鉴https://www.jianshu.com/p/42f1d2909bb6,感谢大神的文章,让我学到很多,工作中若有灵感,还会补充。
来源:https://blog.csdn.net/Soul_taker/article/details/101026741