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” }
答案 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)