2017-08-16 11 views
0

パンダでSUMIFSスタイルの計算をしようとしています。 Power Pivots DAXは完璧に動作するが、何百万行ものスケールに対応していない計算機能を備えています。パンダSUMIFS、行に依存するフィルタ

として単純な例は、累積合計列を計算するためにデータフレームを使用することになる。

Index Customer Spend Date   Cumulative Total 
0  A  100  16/08/2017  280 
1  A  50  15/08/2017  180 
2  B  30  15/08/2017  165 
3  A  50  14/08/2017  130 
4  B  75  14/08/2017  135 
5  C  60  14/08/2017  80 
6  A  80  13/08/2017  80 
7  B  60  13/08/2017  60 
8  C  20  12/08/2017  20 

DFが上記データフレームであろうと、IVEは、行上に関数を適用しようとしたが、それは非常に遅いです

def cumulativeSpend(row): 
    returnvalue = df['Spend'][ 
      (df['Customer']==row['Customer']) 
     & (df['Date'] <= row['Date']) 
     ].sum() 
    return returnvalue 

行の順序は異なりますが、groupbyを使用する方法があるかもしれませんが、調整する方法がわからなければ、日付は< =各行です。事前

答えて

1

多くのおかげでここCustomerグループ

In [160]: (df.sort_values('Date') 
      .groupby('Customer')['Spend'] 
      .transform('cumsum') 
      .sort_index()) 
    ...: 
Out[160]: 
0 280 
1 180 
2 165 
3 130 
4 135 
5  80 
6  80 
7  60 
8  20 
Name: Spend, dtype: int64 

詳細

In [161]: df['cumtot'] = (df.sort_values('Date') 
          .groupby('Customer')['Spend'] 
          .transform('cumsum') 
          .sort_index()) 

In [162]: df 
Out[162]: 
    Customer Spend  Date Cumulative Total cumtot 
0  A 100 2017-08-16    280  280 
1  A  50 2017-08-15    180  180 
2  B  30 2017-08-15    165  165 
3  A  50 2017-08-14    130  130 
4  B  75 2017-08-14    135  135 
5  C  60 2017-08-14    80  80 
6  A  80 2017-08-13    80  80 
7  B  60 2017-08-13    60  60 
8  C  20 2017-08-12    20  20 

Spendcumsumはその後、1つの方法だDatesort_values最初:あなたのDate列である場合文字列、

あなたは次のことを行うことができ
In [158]: df.Date = pd.to_datetime(df.Date, format='%d/%m/%Y') 
+0

分で私を打つ!しかし、同じ基本的なアプローチ。 – asongtoruin

2

:日付でソート

df['Cumulative Spend'] = df.sort_values(by='Date').groupby('Customer')['Spend'].cumsum() 

が昇順ます(注:彼らは、テキストではなく、実際の日付時刻をしている場合、これは失敗する可能性があります)。グループを'Customer'でグループ化し、累積合計を'Spend'に適用します。

+1

df.Date = pd.to_datetime(df.Date)というニースはおそらく – jezrael

+0

であるはずです。ありがとうございました。変換関数もよく見ています – user3112131

+0

.groupby( 'Customer')['実際には、フルグループ化または支出列を作成します つまり、あなたとの違いは何ですか: df [['Customer'、 'Spend']]。groupby( 'Customer')。cumsum() 既にソートされていると仮定します – user3112131

関連する問題