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

2024-06-02 10:32:35 发布

您现在位置:Python中文网/ 问答频道 /正文

          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”相同(因此是的,将有重复值),如果type=cashflow_in,并且日期在某个日期之后(例如使用date=25/07/2020),则“Amount”的总和将相同

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

我试过这样的方法

> 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时)

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

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

          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=“现金流”}

然后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=”现金流“}


Tags: inltdfdatetypeoutamount现金流
2条回答

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

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()
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
   

打印(df)

相关问题 更多 >