首页 > 解决方案 > Pandas Multi-index DataFrame:聚合组内的子组

问题描述

我有以下多索引数据框:

df = pd.DataFrame({
      'cluster': [1, 1, 2, 1, 2, 2, 1, 3, 2],
      'mark': [8, 5, 10, 20, 4, 1, 6, 4, 1],
      'dt': ['2021-03-23', '2021-03-25', '2021-03-23', '2021-03-28', '2021-03-25', '2021-03-28', '2021-03-29', '2021-03-23', '2021-03-31']
})
df.set_index(['cluster', 'dt'], inplace=True)
df.sort_index(inplace=True)
df
                                标记
集群 dt  
1 2021-03-23 8
            2021-03-25 5
            2021-03-28 20
            2021-03-29 6
2 2021-03-23 10
            2021-03-25 4
            2021-03-28 1
            2021-03-31 1
3 2021-03-23 4

我要做的是在每个索引组中生成每周子组的总和,例如

                                总分
集群 start_date_of_week  
1 2021-03-21 13
            2021-03-28 26
2 2021-03-21 14
            2021-03-28 2
3 2021-03-23 4

我知道如何根据日期时间索引的频率生成组。我不知道如何使用一级多索引来做到这一点。有任何想法吗?

标签: pandasgroup-byaggregatemulti-index

解决方案


确保索引的级别 1 是日期时间类型。然后你可以这样做:

print(
    df.groupby(
        [
            pd.Grouper(level=0),
            pd.Grouper(level=1, freq="W", label="left", closed="left"),
        ]
    )["mark"]
    .sum()
    .to_frame()
)

印刷:

                    mark
cluster dt              
1       2021-03-21    13
        2021-03-28    26
2       2021-03-21    14
        2021-03-28     2
3       2021-03-21     4

推荐阅读