【问题标题】:Group by every combination of some columns on a Pandas Datafram按 Pandas Dataframe 上某些列的每个组合进行分组
【发布时间】:2020-11-01 20:54:11
【问题描述】:

我有一个数据框,我想将其转换为摘要数据框。我希望按数据框中某些列的所有可能组合进行分组。
这是初始数据框

我还为每种不同类型的列提供了三个列表:

always_include_columns = ['digimon']
combination_columns = ['stage','type']
sum_column = 'points'

这是数据框:

df = pd.DataFrame({
'digimon':['Kuramon','Pabumon','Punimon','Kuramon','Pabumon','Punimon','Kuramon','Pabumon','Punimon','Kuramon','Pabumon','Punimon'],
'stage':['Baby','Baby','Baby','In-Training','In-Training','In-Training','Baby','Baby','Baby','In-Training','In-Training','In-Training'],
'type':['Neutral','Neutral','Neutral','Neutral','Neutral','Neutral','Fire','Fire','Fire','Fire','Fire','Fire'],
'points':[590,950,870,940,1030,930,1086,1143,1201,1258,1316,1373]})

在此示例中,我想按阶段和类型的每种组合进行分组(例如,仅阶段,仅类型,阶段和类型,两者都不是)。如果缺少一列,我希望它在决赛桌中说“全部”。所以这相当于堆叠 4 个 group-by 表。或者更一般的combination_columns^2 分组表。

最后是我正在寻找的结果:

【问题讨论】:

    标签: pandas dataframe pandas-groupby combinations


    【解决方案1】:

    使用列的 powerset 创建不同的 groupby,然后将它们连接起来:

    from itertools import chain, combinations
    
    def powerset(iterable):
        s = list(iterable)
        return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
    
    dfe =pd.DataFrame()
    for perm in powerset(df.columns[:-1]):
        features =list(perm)
        if len(features) != 0 and 'digimon' in features:
            dfe = pd.concat([dfe,df.groupby(features,as_index=False).agg({'points':'sum'})],axis=0)
            
    dfe.fillna('all').sort_values(['type','stage','digimon'],ascending=False)
    

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 2018-11-25
      • 1970-01-01
      • 2014-05-15
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      相关资源
      最近更新 更多