2017-05-09 1044 views
0

我上周基本上选择了Python,尽管我目前正在学习基础知识,但我一直致力于在工作中使用python构建一个小程序。并希望得到这方面的帮助。 我想创建一个类似于excel版本的SUMIFS函数。我的数据包含现金流量日期(CFDATE),投资组合名称(PORTFOLIO)和现金流量(CF)。我想根据它属于哪个投资组合并根据投资组合的日期来总结CF。 我已经设法使用下面的代码来实现这一点,但是我努力的将结果输出为数组/表格,其中标题行包含所有投资组合,并且最初的列是日期列表(已删除重复项)和CF根据(CFDATE,PORTFOLIO)的每种组合进行分组。有人可以帮助我在Python上创建等效的SUMIFS函数吗?

例如期望的输出的: PORTFOLIO-> 'A' 'B' 'C' CFDATE

'30/09/2017' 300 600 300 '31/10/2017' 300 0 600

迄今使用

代码:

from pandas import Series,DataFrame 
from numpy import matrix 
import numpy as np 
import pandas as pd 

df = DataFrame(pd.read_csv("...\Test.csv")) 
portfolioMapping = sorted(list(set(df.PORTFOLIO))) 
cfDateMapping = list(set(df.CFDATE)) 


for i in range(0,len(portfolioMapping)): 
    dfVar = df.CF * np.where(df.PORTFOLIO == portfolioMapping[i] , 1, 0) 
    for j in range(0,len(cfDateMapping)): 
     dfVar1 = df.CF/df.CF * np.where(df.CFDATE == cfDateMapping[j] , 1, 0) 
     print([portfolioMapping[i],[cfDateMapping[j]],sum(dfVar*dfVar1)]) 

的数据基本上是在这种形式:

PORTFOLIO CFDATE CF 
A 30/09/2017 300 
A 31/10/2017 300 
C 31/10/2017 300 
B 30/09/2017 300 
B 30/09/2017 300 
C 30/09/2017 300 
C 31/10/2017 300 
C 31/10/2017 300 

我真的很感谢在这个问题上的一些帮助。

回答

0

你可以简单地做,与熊猫的pivot_table()

df.pivot_table(index='CFDATE', columns=['PORTFOLIO'], aggfunc=sum, fill_value=0) 

结果如下:

PORTFOLIO A B C 
CFDATE   
30/09/2017 300 600 300 
31/10/2017 300 0 900 
+0

非常感谢你的帮助的家伙,这个网站是要让我的学习体验,更愉快。 – KatZab

0

我觉得你的情况最好是使用一个groupby方法类似如下:

df.groupby(['PORTFOLIO', 'CFDATE']).sum() 

         CF 
PORTFOLIO CFDATE   
A   30/09/2017 600 
      31/10/2017 300 
B   30/09/2017 600 
C   30/09/2017 300 
      31/10/2017 900 

基本上,一旦你分组了你的dataframedf,可以再在其上(如sum()mean()min()max()等)

另外执行各种方法,你罐存储你分组数据帧中的对象类似如下:

grouped = df.groupby(['PORTFOLIO', 'CFDATE']) 

它使其更加灵活地执行后不同的计算:

grouped.sum() 
grouped.mean() 
grouped.count() 
1

你需要groupby + sum + unstack

df = df.groupby(['CFDATE', 'PORTFOLIO'])['CF'].sum().unstack(fill_value=0) 
print (df) 
PORTFOLIO  A B C 
CFDATE     
30/09/2017 300 600 300 
31/10/2017 300 0 900 

或者pivot_table

df = df.pivot_table(index='CFDATE', 
        columns='PORTFOLIO', 
        values='CF', 
        aggfunc=sum, 
        fill_value=0) 
print (df) 
PORTFOLIO  A B C 
CFDATE     
30/09/2017 300 600 300 
31/10/2017 300 0 900 
+0

非常感谢您的帮助,两种方法都可以很好地工作,但我已经使用了pivot_table方法。 – KatZab

+0

这取决于你,但第一种解决方案在更大的df中速度更快。 – jezrael

相关问题