Python 使用Pandas groupby如何使用加法聚合列表列?
我有一个dataframe,其中的列包含一个值列表。数据帧中的每一行都有一个相同长度的列表。我想使用Dataframe.groupby对Dataframe中的数据进行分组,并按以下方式将列表相加: 在: 输出:Python 使用Pandas groupby如何使用加法聚合列表列?,python,pandas,numpy,pandas-groupby,Python,Pandas,Numpy,Pandas Groupby,我有一个dataframe,其中的列包含一个值列表。数据帧中的每一行都有一个相同长度的列表。我想使用Dataframe.groupby对Dataframe中的数据进行分组,并按以下方式将列表相加: 在: 输出: 一种解决方案是将列表转换为np.array并使用简单求和 a['v'] = a.v.transform(np.array) a.groupby('grp').v.apply(lambda x: x.sum()) grp v 0 test [5, 7, 9, 1
一种解决方案是将
列表转换为np.array
并使用简单求和
a['v'] = a.v.transform(np.array)
a.groupby('grp').v.apply(lambda x: x.sum())
grp v
0 test [5, 7, 9, 11, 13]
请注意,我使用numpy.stack
将values
更改为v
,以避免与.values
访问器从pd.DataFrame错误:
pd.DataFrame(
[(i, np.stack(g).sum(0)) for i, g in a.groupby('grp')['values']],
columns=['grp', 'values']
)
也可以使用apply
,但apply
会很慢:
a.groupby('grp')['values'].apply(lambda x: np.stack(x).sum(0)).to_frame('values')
把它排成一行
a.groupby('grp')['values'].apply(lambda x : pd.DataFrame(x.values.tolist()).sum().tolist())
Out[286]:
grp
test [5, 7, 9, 11, 13]
Name: values, dtype: object
另外,我建议不要在此处使用apply
b=pd.DataFrame(a['values'].values.tolist()).groupby(a['grp']).sum()
pd.DataFrame({'grp':b.index,'values':b.values.tolist()})
Out[293]:
grp values
0 test [5, 7, 9, 11, 13]
您可能不喜欢这个答案,但最好不要在数据帧中使用列表。在可能的情况下,您应寻求对数字数据使用数字系列:
res = df.join(pd.DataFrame(df.pop('values').tolist()))\
.groupby('grp').sum().reset_index()
print(res)
grp 0 1 2 3 4
0 test 5 7 9 11 13
这就是我的建议:-)我理解apply的性能含义,但是对于我的实际实现来说,它是最合适的。谢谢你的解决方案!
values
grp
test [5, 7, 9, 11, 13]
a.groupby('grp')['values'].apply(lambda x : pd.DataFrame(x.values.tolist()).sum().tolist())
Out[286]:
grp
test [5, 7, 9, 11, 13]
Name: values, dtype: object
b=pd.DataFrame(a['values'].values.tolist()).groupby(a['grp']).sum()
pd.DataFrame({'grp':b.index,'values':b.values.tolist()})
Out[293]:
grp values
0 test [5, 7, 9, 11, 13]
res = df.join(pd.DataFrame(df.pop('values').tolist()))\
.groupby('grp').sum().reset_index()
print(res)
grp 0 1 2 3 4
0 test 5 7 9 11 13