2017-08-23 76 views
1

我有以下结构的pandas.DataFrameGROUPBY并降低与numpy的阵列熊猫dataframes作为条目

>>> 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。我确信有一种可以实现这个目标的手段 - 但是如何? 谢谢。

回答

2

类似于约翰·高尔特的回答,您可以组,然后应用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不起作用。

+0

我该如何实现,即所得的列仍然具有“值”的名称? – rammelmueller

+0

@rammelmuller你想对a和b做什么?算了吧? –

+0

''b''默认被丢弃,''a''应该保持并且被称为相同。 – rammelmueller

1

您可以使用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] 
+0

看来,用numpy数组的sum版本不起作用,它失败了,消息:'函数不会减少' - 我编辑了numpy数组细节有点太拉特,抱歉。 – rammelmueller