在DataFrame中的所有列上使用groupby()

时间:2018-08-13 15:53:22

标签: python pandas pandas-groupby

我试图合并共享相同索引的DataFrame中的所有行,以便将所有数据放入该索引每一列的列表中。

例如:

dict = {'ID': ['alpha', 'alpha', 'bravo', 'bravo', 'charlie', 'charlie'], 'Var1': [1, 2, 3, 3, 5, 5], 'Var2': [10, 10, 12, 13, 10, 11]}

df = pd.DataFrame(dict)

df.set_index('ID')

         Var1  Var2
ID                 
alpha       1    10
alpha       2    10
bravo       3    12
bravo       3    13
charlie     5    10
charlie     5    11

目标是获得:

           Var1      Var2
ID                       
alpha    [1, 2]  [10, 10]
bravo    [3, 3]  [12, 13]
charlie  [5, 5]  [10, 11]

当我做我认为很明显的事情时,它没有按预期工作:

new_df = df.groupby('ID')[df.columns].apply(list)

print(new_df)

ID
alpha      [Var1, Var2]
bravo      [Var1, Var2]
charlie    [Var1, Var2]


我唯一能想到的解决方案是遍历每列并合并每个结果,如下所示:

new_df = pd.DataFrame()

for i in df.columns:
    y = df.groupby('ID')[i].apply(list)
    new_df = pd.concat([new_df, y], axis = 1)

print(new_df)

           Var1      Var2
ID                       
alpha    [1, 2]  [10, 10]
bravo    [3, 3]  [12, 13]
charlie  [5, 5]  [10, 11]

这似乎超出了必要,因此我想知道是否有更好的方法来执行该操作。

1 个答案:

答案 0 :(得分:3)

您应该使用agg

df.groupby('ID')['Var1','Var2'].agg(lambda x : x.values.tolist())
Out[576]: 
           Var1      Var2
ID                       
alpha    [1, 2]  [10, 10]
bravo    [3, 3]  [12, 13]
charlie  [5, 5]  [10, 11]