Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pandas groupby如何使用加法聚合列表列?_Python_Pandas_Numpy_Pandas Groupby - Fatal编程技术网

Python 使用Pandas groupby如何使用加法聚合列表列?

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

我有一个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, 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