pandas合并groupby_Pandas的GroupBy机制

本文介绍了Pandas的GroupBy机制,包括数据分组、应用函数与结果合并。通过泰坦尼克号数据集展示了如何按特征分组并分析存活率。此外,还讲解了如何利用GroupBy填充缺失值,如使用均值和固定值填充。
摘要由CSDN通过智能技术生成

Pandas的GroupBy机制

本文作者:孙晓玲
文字编辑:孙晓玲
技术总编:张 邯

作为炙手可热的Python数据分析包,Pandas具有很多好用的数据类型,利如Series、DataFrame、Categorical。在数据分析过程中,描述数据是对具有某些特征的列进行的,分析结果也需要对具体的组进行对比分析,GroupBy就是能满足这种需求的一种分组机制。GroupBy的应用包括三个流程:

(split - apply - combine)
Splitting: 将数据按需求分组;
Applying: 对每个小组进行函数操作;
Combining: 合并结果。

接下来我将对其进行介绍。首先,导入所需库与所用数据。这里用到的数据为泰坦尼克号遇难乘客数据集,为了展示的方便,对导入的数据进行处理只保留所感兴趣的数据,查看数据基本概貌。

import pandas as pd
import numpy as np
ror = pd.read_csv('D:/titanic.csv')
titanic=ror.iloc[:,0:6]
titanic.head()

6c68af56fc40c65be99fed009ed8400d.png

一、分组机制的产生

将数据对乘客所在船舱等级(“pclass”)进行分组,使用分组函数groupby并对查看分组结果。

my_group1=titanic.groupby('pclass')
my_group1

29ed80b86f5e1619fcab90d3e865dbd4.png

可以发现,此时数据不再是DataFrame数据,而是一种DataFrameGroupBy对象。顾名思义由DataFrame转换而来的分组对象为DataFrameGroupBy,由Series转换的分组对象就是SeriesGroupBy。按my_group1分组结果继续计数,发现年龄(“age”)列具有数据缺失。

my_group1.count()

765c40ce9eb2fc4b8505a9b737e420ff.png

如果想根据分组对具体的某一列数据进行分析,在分组后选择所需的列即可。还可以通过传入agg方法选择所需的函数。这里以不同性别下的存活情况为例,输出存活率与存活人数。

my_group2=titanic.groupby('sex')
sex_sur=my_group2['survived'].agg(['mean','count'])
sex_sur

bf656313413046b0ea113d02d0e84257.png

我在学习分组机制中,惊喜地发现分组机制下的绘图真的很好用。如下绘制了不同舱级下年龄的部分描述性统计结果的柱状图。图的结果意义不大,仅作为演示,这里用到了Ipython中利用魔术命令调用matplotlib库绘图的快捷方法。

%matplotlib inline
my_group1['age'].agg(['mean','std','count','max']).plot(kind='bar')

a38f22c506c8f4b4e100099743072ebc.png

上面介绍了单层的数据分组,通过向groupby函数传递多个列,可以实现多层分组,实现数据透视表功能。这里以舱级(“pclass”)为第一层分组、性别(“sex”)为第二层分组输出分组数据的均值与计数。

my_group2=titanic.groupby(['pclass','sex'])
my_group2.agg(['mean','count'])

2b576a760197717de9aecea512a349c1.png

为了识别的方便,可以自己将agg方法调用的函数重命名为好理解的函数名,以一对圆括号括住 (‘new name’, ‘function’) 便可实现。

my_group2=titanic.groupby(['pclass','sex'])
my_group2.agg([('均值','mean'),('计数','count')])

0685262b828422190747d81b350ef4f1.png

二、填充缺失值

Groupby机制的应用范围很广,接下来我将介绍用其填充缺失值的方法。首先随机生成一个具有缺失值的学生成绩数据。

data=pd.DataFrame({
    'name':['Mary','Andy','Bob','Tom','Alice','James','Mike','Lily'],
        'sex':['female','female','man','man','female','man','man','female'],
       'score':np.random.randn(8)})
data[::2]['score']= np.nan
data

db58e563ca8543bf207348dd47ed84a2.png

1.利用均值填充

面对数据缺失,常用的填充方法是利用均值填充缺失值。

data.groupby('sex').mean()

9bbee1bb4b79fd90843a941b76183713.png
fill_mean = lambda g: g.fillna(g.mean())
data.groupby('sex').apply(fill_mean)

5b039c553960b872579a3f869c670ef0.png

2.利用固定值填充

有时候,我们想将不同类的缺失值填充为固定值,就可以这样进行处理。

fill_values = {'female': 0.5, 'man': 0.75}
fill_func = lambda g: g.fillna(fill_values[g.name])
data.groupby('sex').apply(fill_func)

a8e762a34cf7ca08c9094f25e4095f56.png

Pandas的GroupBy机制的基本介绍就到这里了~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值