2016-10-03 11 views
1

私はPython 3.5.1とPandas 0.18.0を使用しています。パンダ:複数のgroupby列を持つ集計としての集計

私は複数の列を持つパンダのデータフレームを持っているとしましょう。データフレームには、numpy配列を含む1つの列があります。ここでの例である:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame([{'A': 'Label1', 'B': 'yellow', 'C': np.array([0,0,0]), 'D': 1}, 
         {'A': 'Label2', 'B': 'yellow', 'C': np.array([1,1,1]), 'D': 4}, 
         {'A': 'Label1', 'B': 'yellow', 'C': np.array([1,0,1]), 'D': 2}, 
         {'A': 'Label2', 'B': 'green', 'C': np.array([1,1,0]), 'D': 3}]) 
>>> df 
     A  B   C D 
0 Label1 yellow [0, 1, 0] 1 
1 Label2 yellow [1, 1, 1] 4 
2 Label1 yellow [1, 0, 1] 2 
3 Label2 green [1, 1, 0] 3 

I、列AとBによって、そのグループのデータフレームを作成すると和と列C及びDを集約。このよう

   C   D 
A  B 
Label1 yellow [1, 1, 1] 3 
Label2 green [1, 1, 0] 3 
     yellow [1, 1, 1] 4 

Iがしようとすると全体のデータフレーム、列C(numpyの配列を有するもの)を使用して凝集を行う返されない:

>>> df.groupby(['A','B']).sum() 
       D 
A  B 
Label1 yellow 3 
Label2 green 3 
     yellow 4 

IカラムDを無視する場合列Cを出力しようとすると、エラーが発生します。

>>> df[['A','B','C']].groupby(['A','B']).sum() 
Traceback (most recent call last): 
    File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 96, in f 
    return self._cython_agg_general(alias, numeric_only=numeric_only) 
    File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3038, in _cython_agg_general 
    how, numeric_only=numeric_only) 
    File "C:\Anaconda3\lib\site-packages\pandas\core\groupby.py", line 3084, in _cython_agg_blocks 
    raise DataError('No numeric types to aggregate') 
pandas.core.base.DataError: No numeric types to aggregate 

1つの列だけをグループ化して配列列のみを出力すると、配列の合計はc orrectly:

>>> df[['A','C']].groupby(['A']).sum() 
       C 
A 
Label1 [1, 1, 1] 
Label2 [2, 2, 1] 

しかし、私は同様に骨材としてスカラー列を含めるようにしようとした場合、私の配列の列が再び返されません。また、

>>> df[['A','C','D']].groupby(['A']).sum() 
     D 
A 
Label1 3 
Label2 7 

私がしようとすると、列Bを含む場合(含まれてい集約関数、列BとCのリターンが、列Dにはないの文字列):なぜこれが起こっている

>>> df[['A','B','C']].groupby(['A']).sum() 
       B   C 
A 
Label1 yellowyellow [1, 1, 1] 
Label2 yellowgreen [2, 2, 1] 

は、誰もが説明できますか?私は[A + B]列を作成してそれをグループ化し、配列列を合計し、その結果を列[A + B]の残りのデータとマージすることができますが、はるかに簡単な方法でなければなりません。何か案は?

+0

で曖昧である '和の列C及びDは、凝集'。あなたの期待される結果を示してください。 – piRSquared

+0

あなたが知っているように、表示された 'df'はあなたが構築したものと同じではありません。 – piRSquared

+0

numpy配列のいくつかの値を変更しましたが、出力も同様に更新する必要があります。 – Andrew

答えて

0

pd.concat別個groupbys回避策

g = df.groupby(['A', 'B']) 
pd.concat([g.C.apply(np.sum), g.D.sum()], axis=1) 

enter image description here

+0

Ok希望の出力を表示するために質問を更新しました。 – Andrew

+0

@Andrewの最新の投稿 – piRSquared

関連する問題