2016-10-24 5 views
2

リスト列を持つPandasデータフレームで単純なgroupby操作を実行しようとしています(各グループに対応するリストを連結することを目的として)。単一の列でグループ化するとうまく動作しますが、2つの列にグループ化すると失敗する理由を説明できません。簡単な例:私はab(すなわちx.groupby(['a','b'])['c'].sum())上のグループにしようとした場合 複数の列をグループ化するときにPandasがgroupbyとリストの列を連結します

x.groupby('b')['c'].sum() 

b 
a [1, 2, 3, 4, 5, 6] 
b    [7, 8] 
dtype: object 

x.groupby('a')['c'].sum() 

a 
1 [1, 2, 3, 4] 
2 [5, 6, 7, 8] 
dtype: object 

しかし、それは常にValueError: Function does not reduceで失敗し

:予想通りのいずれか aまたは b作品にグループ化する今

x = pd.DataFrame({'a':[1,1,2,2],'b':['a','a','a','b'],'c':[[1,2],[3,4],[5,6],[7,8]]}) 

    a b  c 
0 1 a [1, 2] 
1 1 a [3, 4] 
2 2 a [5, 6] 
3 2 b [7, 8] 

、 。これは起こるべきなぜ私たちはただのリストを連結しているいずれかの方法として、見ることはできませんが、私はそれがパンダの内部とは何かを持っている想像面に

...

回避策や説明?

+0

これは、 'c'列が数値列の場合にはうまく動作しますので、これは' sum'関数がリストの扱いを理解していないことが関係していると思います。時にはそれは正しいことをするでしょうが、何らかの理由で2回目と呼ばれる方法でそれを崩してしまいます。 – cd98

+0

ああ、良い点。私はそれをチェックすべきだった。いずれにしても、@ kabanusはバグである可能性が高いと思います(私たちがPythonであれば、 'sum'はうまくいけません)。 – moustachio

+0

間違いなくバグですが、 '.apply(sum)'がリスト上で 'sum'関数をどのように動作させるのか興味があります。 – cd98

答えて

2

いくつかの行を合計できない場合はバグかもしれないと思います。たとえば、最後の2つは二重グルーピングで分割されたままです。回避策が適用されます:

import pandas as pd 
x = pd.DataFrame({'a':[1,1,2,2],'b':['a','a','a','b'],'c':[[1,2],[3,4],[5,6],[7,8]]}) 
print x 
    a b  c 
0 1 a [1, 2] 
1 1 a [3, 4] 
2 2 a [5, 6] 
3 2 b [7, 8] 
print x.groupby(('a'))['c'].apply(sum) 
a 
1 [1, 2, 3, 4] 
2 [5, 6, 7, 8] 
Name: c, dtype: object 
print x.groupby(('a'))['c'].sum() 
a 
1 [1, 2, 3, 4] 
2 [5, 6, 7, 8] 
dtype: object 
print x.groupby(('a','b'))['c'].apply(sum) 
a b 
1 a [1, 2, 3, 4] 
2 a   [5, 6] 
    b   [7, 8] 
Name: c, dtype: object 

私はあなたもこれをpandasチームに提出する必要があると思います。

関連する問題