13

Pandas の初心者から: 基本的に次のようなデータがあります -

 data1=pd.DataFrame({'Dir':['E','E','W','W','E','W','W','E'], 'Bool':['Y','N','Y','N','Y','N','Y','N'], 'Data':[4,5,6,7,8,9,10,11]}, index=pd.DatetimeIndex(['12/30/2000','12/30/2000','12/30/2000','1/2/2001','1/3/2001','1/3/2001','12/30/2000','12/30/2000']))
data1
Out[1]: 
           Bool  Data Dir
2000-12-30    Y     4   E
2000-12-30    N     5   E
2000-12-30    Y     6   W
2001-01-02    N     7   W
2001-01-03    Y     8   E
2001-01-03    N     9   W
2000-12-30    Y    10   W
2000-12-30    N    11   E

そして、それを複数のレベルでグループ化し、cumsum() を実行します。

例: running_sum=data1.groupby(['Bool','Dir']).cumsum()<-(動作しません)

出力は次のようになります。

Bool Dir Date        running_sum
N    E   2000-12-30           16
     W   2001-01-02            7
         2001-01-03           16
Y    E   2000-12-30            4
         2001-01-03           12
     W   2000-12-30           16

私の「好きな」コードは明らかに近いものではありません。私は多くの試みを行い、これを行う方法について多くの新しいことを学びました.

ご協力いただきありがとうございます。

4

2 に答える 2

15

これを試して:

data2 = data1.reset_index()
data3 = data2.set_index(["Bool", "Dir", "index"])   # index is the new column created by reset_index
running_sum = data3.groupby(level=[0,1,2]).sum().groupby(level=[0,1]).cumsum()

cumsum単純に onを使用できない理由はdata3、データの構造に関係しています。 集計関数 ( 、など) でグループ化しBoolて適用すると、使用した関数がグループ キーに基づいて値を集計するため、最初よりも小さいサイズの DataFrame が生成されます。ただし、集計関数ではありません。呼び出されたものと同じサイズの DataFrame を返します。したがって、入力 DataFrame が、 を呼び出した後に出力が同じサイズになる形式でない限り、エラーがスローされます。そのため、最初に呼び出して、正しい入力形式で DataFrame を返します。Dirsummeancumsumcumsumsum

これを十分に説明していない場合は申し訳ありません。多分他の誰かが私を助けることができますか?

于 2013-04-02T04:30:29.847 に答える
9

他の回答が指摘しているように、同一の日付を単一の行に折りたたもうとしていますが、cumsum 関数は元の DataFrame と同じ長さのシリーズを返します。別の言い方をすれば、実際には [Bool, Dir, Date] でグループ化し、各グループの合計を計算し、[Bool, Dir] でグループ化された行の合計を返します。もう1つの答えは、特定の質問に対する完全に有効な解決策です.ここにワンライナーのバリエーションがあります:

data1.groupby(['Bool', 'Dir', 'Date']).sum().groupby(level=[0, 1]).cumsum()

これにより、要求された形式で正確に出力が返されます。

Pandas グループで単純な cumsum を探している場合は、次を使用できます。

data1.groupby(['Bool', 'Dir']).apply(lambda x: x['Data'].cumsum())

累積合計は、各グループの内部で計算されます。出力は次のようになります。

Bool  Dir            
N     E    2000-12-30     5
           2000-12-30    16
      W    2001-01-02     7
           2001-01-03    16
Y     E    2000-12-30     4
           2001-01-03    12
      W    2000-12-30     6
           2000-12-30    16
Name: Data, dtype: int64

日付が繰り返されていることに注意してください。ただし、これは Bool 列と Dir 列によって識別される各グループの行の内部で厳密な累積合計を行っています。

于 2014-09-11T23:09:13.970 に答える