在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_IDStore_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_dttot_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 重置索引深度总结

Pandas 重置系列索引以删除多索引

Pandas 重置系列索引以删除多索引

pandas重置dataframe的索引(reset_index)如果索引不匹配dataframe操作时候的问题重置索引(不设置drop=true)远索引生成新的数据列

合并多个Series为DataFrame并且重置索引

pandas使用reindex函数为日期索引中有缺失日期的dataframe进行索引重置(所有日期都连续)并使用fill_value参数为行进行默认填充