pandas 数据框中的聚合,其中一行中的列名

Posted

技术标签:

【中文标题】pandas 数据框中的聚合,其中一行中的列名【英文标题】:Aggregation in pandas dataframe with columns names in one row 【发布时间】:2020-09-15 15:14:27 【问题描述】:

我正在使用Python 3.6 并且我正在做一个聚合,我已经正确地完成了,但是列名不是我想要的形式。

df = pd.DataFrame('ID':[1,1,2,2,2],
                   'revenue':[1,3,5,1,5],
                   'month':['2012-01-01','2012-01-01','2012-03-01','2014-01-01','2012-01-01'])
print(df)
   ID       month  revenue
0   1  2012-01-01        1
1   1  2012-01-01        3
2   2  2012-03-01        5
3   2  2014-01-01        1
4   2  2012-01-01        5

进行下面的聚合。

df = df.groupby(['ID']).agg('revenue':'sum','month':[('distinct_m','nunique'),('month_m','first')]).reset_index()
print(df)
  ID revenue      month            
         sum distinct_m     month_m
0  1       4          1  2012-01-01
1  2      11          3  2012-03-01

期望的输出是:

  ID revenue   distinct_m       month
0  1       4            1  2012-01-01
1  2      11            3  2012-03-01

问题是我在agg() 中使用了混合形式的表达式。如果只是agg('revenue':'sum'),我会得到一个名为revenue 的列,格式与我想要的完全相同,如下所示:

  ID revenue 
0  1       4 
1  2      11 

但是,由于我还要创建 2 个额外的列,使用 tuple 形式 ('distinct_m','nunique'),('month_m','first'),我得到的列名分布在两行中。

有没有办法在一个聚合agg() 中获得上面显示的所需输出?我想避免对'revenue':'sum' 使用元组形式。我不是在寻找多个操作来获得正确的列名。我正在使用Python 3.6

【问题讨论】:

你昨天问了这个确切的问题here 不完全相同,但确实相似。 【参考方案1】:

为了避免这个问题,使用named aggregations在pandas 0.25+中工作,可以指定每个列的名称:

df = (df.groupby(['ID']).agg(revenue=('revenue','sum'),
                             distinct_m=('month','nunique'),
                             month_m = ('month','first')
                            ).reset_index())
print(df)
   ID  revenue  distinct_m     month_m
0   1        4           1  2012-01-01
1   2       11           3  2012-03-01

对于较低的 pandas 版本,可以将 MultiIndex 中的列展平,然后将 rename 中的列展平:

df = df.groupby(['ID']).agg('revenue':'sum',
                             'month':[('distinct_m','nunique'),('month_m','first')])
df.columns = df.columns.map('_'.join)
df = df.rename(columns='revenue_sum':'revenue',
                        'month_distinct_m':'distinct_m',
                        'month_month_m':'month_m')
df = df.reset_index()
print(df)
   ID  revenue  distinct_m     month_m
0   1        4           1  2012-01-01
1   2       11           3  2012-03-01

【讨论】:

按照您的建议,我已经完成了完全相同的操作,但是在 3.6 版上它不起作用。另外,我想使用像'revenue':'sum' 这样的混合表达式,尽可能在需要的地方使用相同的列名和元组。 @cph_sto - 我认为熊猫低于 0.25.0,所以不工作。 是的,没错。我知道这一点,这就是为什么要尝试其他方法。 @cph_sto - 有什么明显的原因;)? 给你先生 :)

以上是关于pandas 数据框中的聚合,其中一行中的列名的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框中的行排序和聚合

Pandas 使用动态列名聚合

如何通过使用数据框中的其他列来聚合熊猫数据框中的列

Pandas实现groupby分组聚合后不同列数据统计

Postgres:如何聚合一行以报告具有最高值的列名?

在 Python Pandas 中聚合组并从某个计数中吐出百分比