41

私の最初の SO の質問: パンダ (0.12.0-4) の groupby の適用メソッドのこの動作について混乱しています。関数 TWICE をデータ フレームの最初の行に適用するようです。例えば:

>>> from pandas import Series, DataFrame
>>> import pandas as pd
>>> df = pd.DataFrame({'class': ['A', 'B', 'C'], 'count':[1,0,2]})
>>> print(df)
   class  count  
0     A      1  
1     B      0    
2     C      2

最初に groupby 関数が正常に動作することを確認しましたが、問題ないようです。

>>> for group in df.groupby('class', group_keys = True):
>>>     print(group)
('A',   class  count
0     A      1)
('B',   class  count
1     B      0)
('C',   class  count
2     C      2)

次に、groupby オブジェクトで apply を使用して同様のことを実行しようとすると、最初の行の出力が 2 回得られます。

>>> def checkit(group):
>>>     print(group)
>>> df.groupby('class', group_keys = True).apply(checkit)
  class  count
0     A      1
  class  count
0     A      1
  class  count
1     B      0
  class  count
2     C      2

どんな助けでも大歓迎です!ありがとう。

編集: @Jeff は以下の回答を提供します。私は密度が高く、すぐには理解できなかったので、上記の例の最初のグループの二重出力にもかかわらず、apply メソッドが最初のグループで 1 回だけ動作し、元のデータ フレームを変更しないことを示す簡単な例を次に示します。 :

>>> def addone(group):
>>>     group['count'] += 1
>>>     return group

>>> df.groupby('class', group_keys = True).apply(addone)
>>> print(df)

      class  count
0     A      1
1     B      0
2     C      2

しかし、メソッドの戻り値を新しいオブジェクトに割り当てると、期待どおりに機能することがわかります。

>>> df2 = df.groupby('class', group_keys = True).apply(addone)
>>> print(df2)

      class  count
0     A      2
1     B      1
2     C      3
4

3 に答える 3

39

ここここで説明されているように、これは仕様によるものです。

関数はapply、返されたデータがどのように結合されるかをインテリジェントに把握するために、返されたデータの形状を知る必要があります。これを行うには、これを達成するために関数(checkitあなたの場合)を2回呼び出します。

実際のユースケースに応じて、ここで詳しく説明されているように、への呼び出しを 、または にapply置き換えるaggregateことtransformができます。これらの関数は、戻り値が特定の形状である必要があるため、関数を 2 回呼び出さないでください。filter

ただし、呼び出している関数に副作用がない場合は、関数が最初の値で 2 回呼び出されても問題にならない可能性が高くなります。

于 2014-09-08T01:39:33.043 に答える