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 数据框中的聚合,其中一行中的列名的主要内容,如果未能解决你的问题,请参考以下文章