前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5分钟掌握Pandas GroupBy

5分钟掌握Pandas GroupBy

作者头像
deephub
发布2021-04-16 16:53:55
2.2K0
发布2021-04-16 16:53:55
举报
文章被收录于专栏:DeepHub IMBA

数据分析本质上就是用数据寻找问题的答案。当我们对一组数据执行某种计算或计算统计信息时,通常对整个数据集进行统计是不够的。取而代之的是,我们通常希望将数据分成几组,并执行相应计算,然后比较不同组之间的结果。

假设我们是一个数字营销团队,正在调查最近转换率下降的潜在原因。从整体来看转化率并不能让我们找到可能的原因。我们希望比较不同营销渠道,广告系列,品牌和时间段之间的转化率,以识别指标的差异。

Pandas是非常流行的python数据分析库,它有一个GroupBy函数,提供了一种高效的方法来执行此类数据分析。在本文中,我将简要介绍GroupBy函数,并提供这个工具的核心特性的代码示例。

数据

在整个教程中,我将使用在openml.org网站上称为“ credit-g”的数据集。该数据集由提出贷款申请的客户的许多功能和一个目标变量组成,该目标变量指示信贷是否还清。

可以在此处下载数据(https://www.openml.org/d/31),也可以使用Scikit-learn API导入数据,如下所示。

代码语言:javascript
复制
 import pandas as pd
 import numpy as np
 from sklearn.datasets import fetch_openml
 
 X,y = fetch_openml(name='credit-g', as_frame=True, return_X_y=True)
 df = X
 df['target'] = y
 df.head()

基本用法

此函数最基本的用法是将GroupBy添加到整个dataframe并指定我们要进行的计算。这将生成所有变量的摘要,这些变量按您选择的段分组。这是快速且有用方法。

在下面的代码中,我将所有内容按工作类型分组并计算了所有数值变量的平均值。输出显示在代码下方。

代码语言:javascript
复制
 df.groupby(['job']).mean()

如果我们想要更具体一些,我们可以取dataframe的一个子集,只计算特定列的统计信息。在下面的代码中,我只选择credit_amount。

代码语言:javascript
复制
 data[['job', 'credit_amount']].groupby(['job']).mean()

我们也可以按多个变量分组。这里我按工作和住房类型计算了平均信贷金额。

代码语言:javascript
复制
 data[['job', 'housing','credit_amount']].groupby(['job', 'housing']).mean()

多聚合

groupby后面使用agg函数能够计算变量的多个聚合。

在下面的代码中,我计算了每个作业组的最小和最大值。

代码语言:javascript
复制
 data[['job', 'credit_amount']].groupby(['job']).agg([min, max])

也可以对不同的列使用不同的聚合。在这里,我计算了credit_amount的最小和最大金额以及每种工作类型的平均年龄。

代码语言:javascript
复制
 df[['job', 'credit_amount', 'age']].groupby(['job']).agg(
     {'credit_amount': ['min', 'max'], 'age': 'mean'})

聚合命名

NamedAgg函数允许为多个聚合提供名称,从而提供更清晰的输出。

代码语言:javascript
复制
 df[['target', 'credit_amount', 'age']].groupby('target').agg(
     min_credit_amount=pd.NamedAgg('credit_amount', 'min'),
     max_credit_amount=pd.NamedAgg('credit_amount', 'max'),
     average_age=pd.NamedAgg('age', 'mean'))

自定义聚合

也可以将自定义功能应用于groupby对聚合进行自定义的扩展。

例如,如果我们要计算每种工作类型的不良贷款的百分比,我们可以使用下面的代码。

代码语言:javascript
复制
 job_count = df[['job', 'target']].groupby(['job', 'target']).agg({'target': 'count'})
 job_percent = job_count.groupby(level=0).apply(lambda x:
                                                  100 * x / float(x.sum()))
 job_percent

可视化绘图

我们可以将pandas 内置的绘图功能添加到GroupBy,以更好地可视化趋势和模式。

我扩展了我在上一节中创建的代码,以创建堆叠的条形图,以更好地可视化每种工作类型的好坏贷款的分布。

代码语言:javascript
复制
 df.groupby(['job', 'target'])['job'].count().unstack('target').fillna(0).plot(kind='bar', 
                                                                               stacked=True)

除了使用GroupBy在同一图表中创建比较之外,我们还可以在多个图表中创建比较。

代码语言:javascript
复制
 df[['duration', 'target']].groupby('target').boxplot()

总结

pandas GroupBy函数是一个工具,作为数据科学家,我几乎每天都会使用它来进行探索性数据分析。本文是该功能基本用法的简短教程,但是可以使用许多更强大的方法来分析数据。

如果你需要本篇文章完整代码,可以在这里找到:https://github.com/rebecca-vickery/machine-learning-tutorials/blob/master/data-analysis/pandas_grouby.ipynb

作者:Rebecca Vickery

原文地址:https://towardsdatascience.com/5-minute-guide-to-pandas-groupby-929d1a9b7c65

deephub翻译组

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DeepHub IMBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据
  • 基本用法
  • 多聚合
  • 聚合命名
  • 自定义聚合
  • 可视化绘图
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档