2017-08-16 102 views
0

我想用熊貓做SUMIFS風格的計算。 Power Pivots DAX具有CALCULATE功能,可以很好地工作,但不會擴展到數百萬行。熊貓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將是數據幀以上:

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

這些行是無序的,可能有使用groupby的方法,但如果有的話我還沒有想出如何調整它,所以日期是< =每一行。

提前非常感謝

回答

1

這裏有Date第一,然後在SpendcumsumCustomer

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 

的一種方式,sort_values詳細

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 

注意:如果您的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')[' ('Customer','Spend']]。groupby('Customer')。cumsum() (「Customer」,'Spend']]。假設它已經排序 – user3112131