使用 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_frame
和 pd.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
对于列表来说效率很低,当 Values
是 np.array
.
时不起作用
我有一个 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_frame
和 pd.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
对于列表来说效率很低,当 Values
是 np.array
.