pandas 如何根据每行中的条件对行的值求和?

q9rjltbz  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(133)

你能帮我一个更好的解决方案,总结数据的基础上的条件在单独的行。
我必须按金额列上的自定义逻辑处理分组。添加投资和资本并从中减去借款和利息金额,只有当货币键匹配时才应该发生,否则创建一个新列,上面的逻辑分别考虑货币,而不是混合不同货币的金额。另一个需要考虑的条件是,只有当所有4种类型的流量都存在时才进行此计算。
例如,我的数据是

Deal        Flow  Amount Currency
0     1  Investment     100      USD
1     1      Borrow      10      USD
2     1    Interest       5      USD
3     1     Capital      50      EUR
4     2  Investment     100      USD
5     2      Borrow      10      USD
6     2    Interest       5      USD
7     2     Capital      50      USD
8     3  Investment     100      USD
9     3      Borrow      10      EUR
10    3    Interest       5      USD
11    4  Investment     100      USD
12    4      Borrow      10      EUR
13    4    Interest       5      USD
14    4     Capital      50      USD

预期输出为

Deal  Amount Currency  Amount Currency
0    1      85      USD    50.0      EUR
1    2     135      USD     NaN     None
2    4     145      USD   -10.0      EUR
x4shl7ld

x4shl7ld1#

数据

dict = {
    'Deal' : [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4],
    'Flow' : ['Investment', 'Borrow', 'Interest', 'Capital', 'Investment', 'Borrow', 'Interest', 'Capital', 'Investment',
           'Borrow', 'Interest', 'Investment', 'Borrow', 'Interest', 'Capital'],
    'Amount' : [100, 10 ,5 ,50 ,100 ,10 ,5 ,50 ,100 ,10 ,5 ,100 ,10 ,5 ,50 ],
    'Currency' : ['USD' ,'USD' ,'USD' ,'EUR' ,'USD' ,'USD' ,'USD' ,'USD' ,'USD' ,'EUR' ,'USD' ,'USD' ,'EUR' ,'USD' ,'USD']
}

df = pd.DataFrame(dict)

创建新列以区分基于流量的负金额。

df['New_Amount'] = df.apply(lambda x : -1 * x['Amount'] if x['Flow'] in ['Borrow', 'Interest'] else x['Amount'], axis=1)

创建交易列表,其中流计数为4,然后筛选 Dataframe

dealed_df = df.groupby('Deal').agg({'Flow':'count'}).reset_index()
list_deal = dealed_df[dealed_df['Flow']==4]['Deal'].to_list()
filtered_df = df[df['Deal'].isin(list_deal)]

然后根据交易按 Dataframe 分组,对new_amount求和

filtered_df.groupby(['Deal', 'Currency']).agg({'New_Amount':'sum'}).reset_index().pivot(index='Deal', columns='Currency', values='New_Amount').reset_index()

结果

Currency    Deal    EUR     USD
0           1       50.0    85.0
1           2       NaN     135.0
2           4       -10.0   145.0

相关问题