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