尝试在python中创建一个对多个条件求和的新列

尝试在python中创建一个对多个条件求和的新列,python,pandas,Python,Pandas,上面是我的大致数据集,我一直在尝试创建一个新列,如果“AccountRef”相同(因此是的,将有重复值),如果type=cashflow_in,并且日期在某个日期之后(例如使用date=25/07/2020),则“Amount”的总和将相同 在这之后我也将是另一个专栏,但是计算方法应该类似,所以我应该能够再次替换过滤器/函数 我试过这样的方法 Date AccountRef Amount Type 0 2019-04-15 REF0005 25

上面是我的大致数据集,我一直在尝试创建一个新列,如果“AccountRef”相同(因此是的,将有重复值),如果type=cashflow_in,并且日期在某个日期之后(例如使用date=25/07/2020),则“Amount”的总和将相同

在这之后我也将是另一个专栏,但是计算方法应该类似,所以我应该能够再次替换过滤器/函数

我试过这样的方法

          Date AccountRef      Amount       Type
0   2019-04-15   REF0005  25000.00   cashflow_in
1   2019-04-15   REF004  20000.00   cashflow_in
2   2019-06-07   REF005   2000.00   cashflow_in
3   2019-07-24   REF005   3000.00   cashflow_in
4   2019-07-25   REF004   5000.00   cashflow_out
5   2019-08-08   REF004   5000.00   cashflow_in
6   2019-09-10   REF004   5000.00   cashflow_out
7   2019-10-13   REF005   5000.00   cashflow_out
8   2019-10-30   REF006   5000.00   cashflow_in
9   2019-11-08   REF009   2500.00   cashflow_out
10  2019-11-23   REF005   5000.00   cashflow_in
11  2019-11-30   REF011   5000.00   cashflow_out
但它并没有按照它应该的方式工作。它基于excel中的SumIF命令

按建议编辑。 我的期望输出是符合这些标准的每一行中的一个值(或者更准确地说是“总和”)(在某个日期之前,当所有值与同一行中的值相同时,以及当键入-cashflow_in时)

第二个标准很奇怪,但之后我将添加第二列并更改日期,很抱歉我的问题

编辑2:显示我想要的示例 2019-11-01之前的日期

> df = df[df['Type'] == 'cashflow_in'] 
> df['CumluativeIn'] = df.apply(lambda row: df[df['AccountRef'] == row['AccountRef']]['Amount'].sum(), axis=1)
在Excel中(假设0=A2,F2是新列中的第一个数据点),这将是 新列=Sumifs{金额列

或者更准确地说

F2=Sumifs{$D$2:$D$12,$C$2:$C$12,C2,$B$2:$B$12,<“2019-11-01”,$F$2:$F$12=“现金流”}

然后F3变成 F3=Sumifs{$D$2:$D$12,$C$2:$C$12,C3,$B$2:$B$12,<'2019-11-01',$F$2:$F$12=“现金流”}
F4=Sumifs{$D$2:$D$12,$C$2:$C$12,C4,$B$2:$B$12,<“2019-11-01”,$F$2:$F$12=“现金流”}

我可能不理解你问题的意图。如果你想按账户计算总数,你可以通过以下代码实现。 这符合你的意图吗

          Date AccountRef      Amount       Type Cumulative_In
0   2019-04-15   REF0005  25000.00   cashflow_in 30000.00
1   2019-04-15   REF004  20000.00   cashflow_in 25000.00
2   2019-06-07   REF005   2000.00   cashflow_in 30000.00
3   2019-07-24   REF005   3000.00   cashflow_in 30000.00
4   2019-07-25   REF004   5000.00   cashflow_out 25000.00
5   2019-08-08   REF004   5000.00   cashflow_in 25000.00
6   2019-09-10   REF004   5000.00   cashflow_out 25000.00
7   2019-10-13   REF005   5000.00   cashflow_out 30000.00
8   2019-10-30   REF006   5000.00   cashflow_in 5000.00
9   2019-11-08   REF009   2500.00   cashflow_out 0.00
10  2019-11-23   REF005   5000.00   cashflow_in 30000.00
11  2019-11-30   REF011   5000.00   cashflow_out 0.00

在做了很多手脚,和同事们交谈之后,诸如此类——我想我成功了,所以我想我会把答案贴在这里

df['CumluativeIn'] = df.groupby('AccountRef')['Amount'].cumsum()

df
Date    AccountRef  Amount  Type    CumluativeIn
0   2019-04-15  REF0005 25000.0 cashflow_in 25000.0
1   2019-04-15  REF004  20000.0 cashflow_in 20000.0
2   2019-06-07  REF005  2000.0  cashflow_in 2000.0
3   2019-07-24  REF005  3000.0  cashflow_in 5000.0
5   2019-08-08  REF004  5000.0  cashflow_in 25000.0
7   2019-10-13  REF005  5000.0  cashflow_in 10000.0
8   2019-10-30  REF006  5000.0  cashflow_in 5000.0
10  2019-10-23  REF007  5000.0  cashflow_in 5000.0
df_grouped=df.groupby('AccountRef')
facilities=df_grouped.groups.keys()
对于设施中的设施:
df_filtered=df_grouped.get_group(设施)
df_filtered['Date']=pd.to_datetime(df['Date'],格式=“%d/%m/%Y”)
df_filtered=df_filtered.sort_值(按class='Date')
df_还款=df_已过滤[df_已过滤['Type']=='cashflow_in']
df_提取=df_筛选[df_筛选['Type']=='cashflow_out']
总现金流=df现金流['Amount']金额。总和()
打印(总现金流)
df_提取。重置_索引(drop=True,inplace=True)
对于索引,df_cashflow_out.iterrows()中的行:
现金流=行[“金额”]
当前值=现金流流出-总现金流流入
如果当前_值<0:
当前值=0
总现金流输入=总现金流输入-现金流输出
其他:
总现金流=0
df_现金流_out.loc[索引,'当前_值']=当前_值

打印(df)

查看pandas文档中的groupby函数。另外-请提供一个示例输出,以便我们知道目标是什么。啊,对不起,我很抱歉,因为我对这一点还不太了解。我将查看groupby,看看我是否可以让它工作,并就此写一条评论。这是否回答了您的问题?'REF0005'正确吗?'REF'为什么0005'变为30000,为什么'REF004'也变为25000?它从第2行2019-06-07 REF005 2000.00现金流量中增加25000.00 30000.00 2019-07-24 REF005 3000.00现金流量中增加30000.00但不增加(由于“现金流量中”)7 2019-10-13 REF005 5000.00现金流量中增加30000.00和(截止日期)10 2019-11-23 REF005 5000.00现金流量30000.00首先,非常感谢您的回复。我认为这是其中的一部分,但我需要它做的不仅仅是按账户总计。我还需要它有一个过滤器,其中,如果第1列中的日期在某个日期之前,并且其中Type=cashflow,它只按账户总计。我正在为r多标准选择。很抱歉,我们无法满足您的要求。如果您能更好地组织和澄清条件和所需输出,我认为您可以得到更快的答案。不,你们对我帮助很大。我没有那么清楚是我的错。我试图编辑以澄清所需输出(我试着发表这篇评论,但太长了)。
df_grouped = df.groupby('AccountRef')

facilities = df_grouped.groups.keys()
for facility in facilities:
    df_filtered = df_grouped.get_group(facility)
    df_filtered['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
    df_filtered = df_filtered.sort_values(by='Date')
    df_repayments = df_filtered[df_filtered['Type'] == 'cashflow_in']
    df_drawdowns = df_filtered[df_filtered['Type'] == 'cashflow_out']
    total_cashflow_in = df_cashflow_in['Amount'].sum()
    print(total_cashflow_in)
    df_drawdowns.reset_index(drop=True, inplace=True)
    for index, row in df_cashflow_out.iterrows():
        cashflow_out = row['Amount']
        current_value = cashflow_out - total_cashflow_in
        if current_value < 0:
            current_value = 0
            total_cashflow_in = total_cashflow_in - cashflow_out
        else:
            total_cashflow_in = 0
        df_cashflow_out.loc[index, 'current_value'] = current_value