我有一个数据框,其中的一列包含值列表。数据框中的每一行都有一个长度相同的列表。我想使用Dataframe.groupby对数据框中的数据进行分组,并按以下方式汇总列表:
在:
import pandas as pd
#Sample data
a = pd.DataFrame([['a', 'test', list([0,1,2,3,4])],['b', 'test', list([5,6,7,8,9])]], columns=['id', 'grp', 'values'])
print(a)
#Some function to group the dataframe
#b = a.groupby('grp').someAggregationFunction()
#Example of desired output
b = pd.DataFrame([['test', list([5,7,9,11,13])]], columns=['grp', 'values'])
print(b)
出局:
id grp values
0 a test [0, 1, 2, 3, 4]
1 b test [5, 6, 7, 8, 9]
grp values
0 test [5, 7, 9, 11, 13]
答案 0 :(得分:3)
您可能不喜欢这个答案,但是最好不要在数据框中使用列表。您应该尽可能地将数字序列用于数字数据:
Foreground Service
答案 1 :(得分:2)
将其放入一行
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]
答案 2 :(得分:1)
一种解决方案是将您的transform
lists
变成np.arrays
并使用简单的总和
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]
请注意,我已将values
更改为v
,不要误认为.values
的{{1}}访问器
答案 3 :(得分:1)
使用numpy.stack
:
pd.DataFrame(
[(i, np.stack(g).sum(0)) for i, g in a.groupby('grp')['values']],
columns=['grp', 'values']
)
grp values
0 test [5, 7, 9, 11, 13]
也使用apply
,但是apply
会很慢:
a.groupby('grp')['values'].apply(lambda x: np.stack(x).sum(0)).to_frame('values')
values
grp
test [5, 7, 9, 11, 13]