有人能帮我在Python上创建等效的SUMIFS函数吗?

有人能帮我在Python上创建等效的SUMIFS函数吗?,python,excel,pandas,Python,Excel,Pandas,上周我基本上学会了Python,尽管我目前正在学习基础知识,但我的任务是在工作中用Python构建一个小程序。如果能在这方面提供帮助,我将不胜感激。 我想创建一个类似于excel版本的SUMIFS函数。我的数据包含现金流日期(CFDATE)、投资组合名称(portfolio)和现金流金额(CF)。我想根据它所属的投资组合和下跌的日期对CF求和。 我已经使用下面的代码实现了这一点,但是我很难将结果输出为一个数组/表,其中标题行包含所有投资组合,初始列是日期列表(删除重复项),CF根据每个组合(CF

上周我基本上学会了Python,尽管我目前正在学习基础知识,但我的任务是在工作中用Python构建一个小程序。如果能在这方面提供帮助,我将不胜感激。 我想创建一个类似于excel版本的SUMIFS函数。我的数据包含现金流日期(CFDATE)、投资组合名称(portfolio)和现金流金额(CF)。我想根据它所属的投资组合和下跌的日期对CF求和。 我已经使用下面的代码实现了这一点,但是我很难将结果输出为一个数组/表,其中标题行包含所有投资组合,初始列是日期列表(删除重复项),CF根据每个组合(CFDATE,PORTFOLIO)进行分组

e、 期望输出的g: 公文包->“A”“B”“C” CFDATE

'2017年9月30日'300 “2017年10月31日”300 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

我非常感谢您在这件事上的帮助。

您只需使用熊猫的:

结果如下:

PORTFOLIO   A   B   C
CFDATE          
30/09/2017  300 600 300
31/10/2017  300 0   900
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
grouped = df.groupby(['PORTFOLIO', 'CFDATE'])

我认为在您的情况下,最好使用
groupby
方法,如下所示:

PORTFOLIO   A   B   C
CFDATE          
30/09/2017  300 600 300
31/10/2017  300 0   900
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
grouped = df.groupby(['PORTFOLIO', 'CFDATE'])
基本上,一旦您将
数据帧
df
,就可以对其执行各种方法(如
sum()
mean()
min()
max()
,等等)

此外,您可以将分组后的数据帧存储在对象中,如下所示:

PORTFOLIO   A   B   C
CFDATE          
30/09/2017  300 600 300
31/10/2017  300 0   900
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
grouped = df.groupby(['PORTFOLIO', 'CFDATE'])
这样可以更灵活地在之后执行不同的计算:

grouped.sum()
grouped.mean()
grouped.count()
您需要+
sum
+:

或:


非常感谢您的帮助这两种方法都非常有效,但我选择了pivot_table方法。这取决于您,但第一种解决方案在更大的df中更快。非常感谢您的帮助,伙计们,这个网站将使我的学习体验更加愉快。