尝试创建一个新列以汇总python中的多个条件

时间:2020-07-25 20:56:04

标签: python pandas

          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

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

此后我也将成为另一专栏,但是计算方法应该相似,因此我应该能够再次替换过滤器/功能。

我尝试过类似的事情

> df = df[df['Type'] == 'cashflow_in'] 
> df['CumluativeIn'] = df.apply(lambda row: df[df['AccountRef'] == row['AccountRef']]['Amount'].sum(), axis=1)

但是它并没有真正按照应有的方式工作。它基于excel的SumIF命令。

根据我的建议进行编辑。 我的期望输出是满足这些条件的每一行中的一个值(或更准确地说是“总和”)(在某个日期之前,所有值与同一行中的值相同,并且键入-cashflow_in时的总和)。 / p>

第二个怪异的标准,但是之后我将添加第二列并更改日期,对我的问题感到抱歉!

编辑2:显示我想要的示例 日期2019年11月1日之前

          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

在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 = “ cashflow_in”}

然后F3变为 F3 = Sumifs {$ D $ 2:$ D $ 12,$ C $ 2:$ C $ 12,C3,$ B $ 2:$ B $ 12,<“ 2019-11-01”,$ F $ 2:$ F $ 12 =“ cashflow_in” } F4 = Sumifs {$ D $ 2:$ D $ 12,$ C $ 2:$ C $ 12,C4,$ B $ 2:$ B $ 12,<“ 2019-11-01”,$ F $ 2:$ F $ 12 =“ cashflow_in” }

2 个答案:

答案 0 :(得分:0)

我可能不明白您提出问题的意图。如果要按帐户计算总计,则可以使用以下代码来实现。 这符合您的意图吗?

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

答案 1 :(得分:0)

经过反复的摆弄,与我的同事交谈,等等-我想我已经开始工作了,所以我想在这里发布答案。

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
   

print(df)