在pandas中聚合多列时如何重置索引
Posted
技术标签:
【中文标题】在pandas中聚合多列时如何重置索引【英文标题】:How to reset indexes when aggregating multiple columns in pandas 【发布时间】:2017-01-26 21:28:49 【问题描述】:我有我试图分组的数据框,看起来像这样
Cust_ID Store_ID month lst_buy_dt1 purchase_amt
1 20 10 2015-10-07 100
1 20 10 2015-10-09 200
1 20 10 2015-10-20 100
我需要不同数据框中每个月的 ls_buy_dt
的最大值和每个 cust_ID
、Store_ID
组合的最大值或购买金额。样本输出:
Cust_ID Stored_ID month max_lst_buy_dt tot_purchase_amt
1 20 10 2015-10-20 400
我的代码如下。
aggregations =
'lst_buy_dt1': # Get the max purchase date across all purchases in a month
'max_lst_buy_dt': 'max',
,
'purchase_amt': # Sum the purchases
'tot_purchase': 'sum', # Find the max, call the result "max_date"
grouped_at_Cust=metro_sales.groupby(['cust_id','store_id','month']).agg(aggregations).reset_index()
我能够得到正确的聚合。但是,数据框在我无法摆脱的列中包含一个附加索引。无法显示,但这是来自
的结果list(grouped_at_Cust.columns.values)
[('cust_id', ''),
('store_id', ''),
('month', ''),
('lst_buy_dt1', 'max_lst_buy_dt'),
('purchase_amt', 'tot_purchase')]
请注意最后 2 列中的层次结构。如何摆脱它?我只需要max_lst_buy_dt
和tot_purchase
列。
【问题讨论】:
【参考方案1】:编辑:根据您的评论,您可以简单地删除列索引的第一级。例如更复杂的聚合:
aggregations =
'lst_buy_dt1':
'max_lst_buy_dt': 'max',
'min_lst_buy_dt': 'min',
,
'purchase_amt':
'tot_purchase': 'sum',
grouped_at_Cust = metro_sales.groupby(['cust_id', 'store_id', 'month']).agg(aggregations).reset_index()
grouped_at_Cust.columns = grouped_at_Cust.columns.droplevel(0)
输出:
tot_purchase min_lst_buy_dt max_lst_buy_dt
0 cust_id 100 2015-10-07 2015-10-07
1 month 100 2015-10-20 2015-10-20
2 store_id 200 2015-10-09 2015-10-09
原答案
我认为您的aggregations
字典太复杂了。如果你关注documentation:
agg =
'lst_buy_dt1': 'max',
'purchase_amt': 'sum',
metro_sales.groupby(['cust_id','store_id','month']).agg(agg).reset_index()
Out[19]:
index purchase_amt lst_buy_dt1
0 cust_id 100 2015-10-07
1 month 100 2015-10-20
2 store_id 200 2015-10-09
您现在只需要重命名结果的列:
grouped_at_Cust.rename(columns=
'lst_buy_dt1': 'max_lst_buy_dt',
'purchase_amt': 'tot_purchase'
)
【讨论】:
谢谢。我这样写字典是因为我可能需要多个聚合。例如- 我需要 lst_buy_dt1 的最大值和最小值。处理这个问题的最佳方法是什么? 谢谢伊恩。但我的问题是,如果我需要同一列的 2 个聚合(最小值和最大值)怎么办?假设在这种情况下我需要 lst_buy_dt1 的 max 和 min 。在这种情况下,我想,我将不得不恢复到我创建的字典。让我知道是否有更好的方法来做到这一点 @sourav,这就是我的意思,我的编辑适用于你的字典。我已经修改了我的问题以使其更清楚。 请注意,columns.droplevel(level=0)
将删除级别 0 的其他列名,因此如果您只对某些列执行聚合但您将包含其他列(例如,如果您正在使用一个 groupby 并希望将每个索引级别引用为它自己的列,例如稍后绘制),使用此方法将需要额外的步骤来添加这些名称。在这种情况下,使用此处详述的方法可能更合适:@987654322 @以上是关于在pandas中聚合多列时如何重置索引的主要内容,如果未能解决你的问题,请参考以下文章
pandas重置dataframe的索引(reset_index)如果索引不匹配dataframe操作时候的问题重置索引(不设置drop=true)远索引生成新的数据列
pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续)并使用fill_value参数为行进行默认填充