簡體   English   中英

有人可以幫我在Python上創建等效的SUMIFS函數嗎?

[英]Can someone help me create SUMIFS function equivalent on Python?

我上周基本學習了Python,盡管我目前正在學習基礎知識,但我的任務是在工作中使用python構建一個小程序。 並希望對此有所幫助。 我想創建一個類似於Excel版本的SUMIFS函數。 我的數據包含現金流量日期(CFDATE),投資組合名稱(PORTFOLIO)和現金流量金額(CF)。 我想根據CF所屬的投資組合以及下跌的日期來總結CF。 我設法使用下面的代碼實現了這一點,但是我正在努力將結果輸出為數組/表,其中標題行包含所有投資組合,而初始列是日期(刪除重復項)和CF根據(CFDATE,PORTFOLIO)的每種組合進行分組。

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

'30 / 09/2017'300600300 '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     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

您可以使用Pandas的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

我認為您的情況最好是使用如下的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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM