我试图合并共享相同索引的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]
这似乎超出了必要,因此我想知道是否有更好的方法来执行该操作。
答案 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]