如何在多索引列中使用groupby

问题描述 投票:3回答:1

我有一个多维数据框,它是从excel表中读取的,最后看起来像下面的输入表。数据框指定了2级列头。

df_1  = pd.DataFrame(df.values[2:], columns=[header_1a, header_1b])
pd.MultiIndex.from_frame(df_1)

输入表。

d = {
    "Hier_1": ["a1", "a1", "a1", "a1", "a1", "a2", "a2"],
    "Hier_2": ["b1", "b1", "b1", "b2", "b2", "b3", "b3"],
    "Hier_3": ["c1", "c2", "c3", "c1", "c2", "c4", "c5"],
    "Param_1": [1, 1, 1, 2, 2, 3, 3],
    "Param_2": ["p", "q", "r", "s", "t", "u", "v"],
}
df = pd.DataFrame(d)
df = df.set_index(["Hier_1", "Hier_2", "Hier_3"])
print(df)
                     Param_1 Param_2
Hier_1 Hier_2 Hier_3                 
a1     b1     c1            1       p
              c2            1       q
              c3            1       r
       b2     c1            2       s
              c2            2       t
a2     b3     c4            3       u
              c5            3       v

我想要一个以Hier 1和Hier 2为键进行分组的输出表。我想让它分组,使param 1的结果是给定的Hier 1和Hier 2集合的Param 1值的总和。我希望输出param 2列显示给定Hier 1和Hier 2的所有Param 2值的列表。

我想要一个这样的输出表。

Instance Name   |               |        
________________|_______________|________
Hier 1  |Hier 2 |Param 1        |Param 2
________|_______|_______________|________
a1      |b1     |3              |p, q, r
a1      |b2     |4              |s, t
a2      |b3     |6              |u, v

下面的表对于一个只有一级列头的数据框来说是可行的。但对于一个有两层列头的数据框,我却什么都做不到。我总是得到一个键错误。

df_1_grouped = df_1.groupby(['Hier1', 'Hier2'], as_index=False).agg({'Param 1': 'sum', 'Param 2': lambda x: tuple(x)})
python pandas pandas-groupby multi-index
1个回答
0
投票

你可以按级别进行分组,保留两列并使用lambda。

df_result = (
    df[["Param_1", "Param_2"]]
    .groupby(level=[0, 1])
    .agg(lambda x: x.sum() if x.dtype == "int64" else ", ".join(x))
)
print(df_result)

               Param_1  Param_2
Hier_1 Hier_2                  
a1     b1            3  p, q, r
       b2            4     s, t
a2     b3            6     u, v
© www.soinside.com 2019 - 2024. All rights reserved.