2017-08-23 16 views
1

としてnumpyのアレイとパンダのデータフレームを減らすには、私は、次の構造を有するpandas.DataFrameを有する:GROUPBYおよびエントリ

>>> 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_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は、リストのための非常に非効率的で、かつValuesnp.arrayあるときは動作しません。

+0

結果の列の名前が '' values''であることをどのように達成できますか? – 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配列では、和バージョンは機能しません。「function does not reduce」というメッセージが表示されているようです。 – rammelmueller

関連する問題