2017-08-16 191 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