使用 numpy 数组作为条目分组并减少 pandas 数据帧

Groupby and reduce pandas dataframes with numpy arrays as entries

我有一个 pandas.DataFrame 结构如下:

>>> data 
a    b    values
1    0    [1, 2, 3, 4]
2    0    [3, 4, 5, 6]
1    1    [1, 3, 7, 9]
2    1    [2, 4, 6, 8]

'values' 的类型为 numpy.array)。我想要做的是按列 'a' 对数据进行分组,然后组合值列表。 我的目标是实现以下目标:

>>> data 
a    values
1    [1, 2, 3, 4, 1, 3, 7, 9]
2    [3, 4, 5, 6, 2, 4, 6, 8]

请注意,值的顺序 并不 重要。我如何实现这一目标?我想像

>>> grps = data.groupby(['a'])
>>> grps['values'].agg(np.concatenate)

但这失败了KeyError。我敢肯定有一个 pandaic 的方式来实现这一点 - 但如何呢? 谢谢。

您可以使用 sum 加入列表。

In [640]: data.groupby('a')['values'].sum()
Out[640]:
a
1    [1, 2, 3, 4, 1, 3, 7, 9]
2    [3, 4, 5, 6, 2, 4, 6, 8]
Name: values, dtype: object

或者,

In [653]: data.groupby('a', as_index=False).agg({'values': 'sum'})
Out[653]:
   a                    values
0  1  [1, 2, 3, 4, 1, 3, 7, 9]
1  2  [3, 4, 5, 6, 2, 4, 6, 8]

类似于John Galt的回答,你可以分组然后应用np.hstack:

In [278]: df.groupby('a')['values'].apply(np.hstack)
Out[278]: 
a
1    [1, 2, 3, 4, 1, 3, 7, 9]
2    [3, 4, 5, 6, 2, 4, 6, 8]
Name: values, dtype: object 

要取回相框,您需要 pd.Series.to_framepd.reset_index:

In [311]: df.groupby('a')['values'].apply(np.hstack).to_frame().reset_index()
Out[311]: 
   a                    values
0  1  [1, 2, 3, 4, 1, 3, 7, 9]
1  2  [3, 4, 5, 6, 2, 4, 6, 8]

性能

df_test = pd.concat([df] * 10000) # setup

%timeit df_test.groupby('a')['values'].apply(np.hstack) # mine
1 loop, best of 3: 219 ms per loop

%timeit df_test.groupby('a')['values'].sum() # John's 
1 loop, best of 3: 4.44 s per loop

sum 对于列表来说效率很低,当 Valuesnp.array.

时不起作用