查看原文
其他

Pandas的GroupBy机制

爬虫俱乐部 Stata and Python数据分析 2022-03-15

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

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

(split - apply - combine)

  • Splitting: 将数据按需求分组;

  • Applying: 对每个小组进行函数操作;

  • Combining: 合并结果。

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

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

一、分组机制的产生

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

my_group1=titanic.groupby('pclass')my_group1

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

my_group1.count()

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

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

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

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

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

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

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

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

二、填充缺失值

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.nandata

1.利用均值填充

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

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

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

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)

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







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
首行数据如何快速转变量名?
文件太多乱乱的?合并一下吧!
线性回归的正则化 ——岭回归与LASSO回归
Pandas中节约空间的小tip—categorical类型
Ftools命令组之flevelsof命令介绍
疫情下的家庭关系|《请回答1988》影评爬取
教你把Python当美图秀秀用(二)
自己动手进行线性回归计算
personage与年龄
原来这才是查看盲评结果的正确方式
教你把Python当美图秀秀用(一)
用数据透视表剖析泰坦尼克号乘客数据
读入文本文档,intext来帮忙
matchit——解锁文本相似度的钥匙
基于广义线性模型的机器学习算法——线性回归
听说你会魔法?
dummieslab——从分类变量到虚拟变量的“一步之遥”

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存