有人可以帮助我在Python上创build等效的SUMIFS函数吗?

我上周基本上select了Python,虽然我现在正在学习基础知识,但是我一直被授权在工作中使用python构build一个小程序。 并会感谢一些帮助。 我想创build一个类似于Excel版本的SUMIFS函数。 我的数据包含现金stream量date(CFDATE),投资组合名称(PORTFOLIO)和现金stream量(CF)。 我想根据它属于哪个投资组合,并基于它所属的date来总结CF. 我设法使用下面的代码来实现这一点,但是我很努力地输出我的结果作为一个数组/表,其中标题行包含所有的投资组合,最初的列是date列表(删除重复)和CF根据(CFDATE,PORTFOLIO)的每种组合进行分组。

例如期望的输出: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 

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

你需要groupby + sum + unstack

 df = df.groupby(['CFDATE', 'PORTFOLIO'])['CF'].sum().unstack(fill_value=0) print (df) PORTFOLIO ABC 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 ABC CFDATE 30/09/2017 300 600 300 31/10/2017 300 0 900 

你可以用pandas的pivot_table()来做到这一点:

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

结果如下:

 PORTFOLIO ABC CFDATE 30/09/2017 300 600 300 31/10/2017 300 0 900 

我认为在你的情况下最好的是使用如下的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 

基本上,一旦你分组你的dataframe df ,你可以在其上执行各种方法(如sum()mean()min()max()等)

此外,您可以将分组数据框存储在以下对象中:

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

这使得以后执行不同的计算变得更加灵活:

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