我有一个名为df
的3列数据框:
Currency Product Balance
USD A 10
GBP B 20
USD A 15
GBP A 5
USD B 30
USD A 20
USD B 5
想要计算每种独特产品和货币组合的权重。
以下代码为我提供了每种组合的总数:
df.groupby(['Currency','Product'])['Balance'].sum().
我希望在第4列添加余额编号,然后通过在groupby表中查找该组合的聚合值来划分它:
Currency Product Balance Weight
USD A 10 28.57%
GBP B 20 100.00%
USD A 15 42.86%
GBP A 5 100.00%
USD B 30 85.71%
USD A 20 57.14%
USD B 5 14.29%
伪代码将是:
df['Weight'] = df['Balance'] / look up value in the groupby table above
权重中的分子是余额,分母是该货币中同一产品的总和,因此3种产品和4种货币将给我们12个总数。
请帮忙。
答案 0 :(得分:2)
您可以将余额除以groupby
的{{3}}(与原始数据框保持相同的尺寸):
df['Weight'] = df.Balance / df.groupby(['Currency', 'Product']).Balance.transform(sum)
>>> df
Currency Product Balance Weight
0 USD A 10 0.222222
1 GBP B 20 1.000000
2 USD A 15 0.333333
3 GBP A 5 1.000000
4 USD B 30 0.857143
5 USD A 20 0.444444
6 USD B 5 0.142857
为了更好地了解正在发生的事情:
df['Sum'] = df.groupby(['Currency', 'Product']).Balance.transform(sum)
>>> df
Currency Product Balance Weight Sum
0 USD A 10 0.222222 45
1 GBP B 20 1.000000 20
2 USD A 15 0.333333 45
3 GBP A 5 1.000000 5
4 USD B 30 0.857143 35
5 USD A 20 0.444444 45
6 USD B 5 0.142857 35
>>> df.groupby(['Currency', 'Product']).Balance.sum()
Currency Product
GBP A 5
B 20
USD A 45
B 35
Name: Balance, dtype: int64
答案 1 :(得分:0)
您可以使用apply:
agg = df.groupby(['Currency', 'Product']).sum()
df['weight'] = df.apply(lambda row: row['Balance']/agg.loc[row['Currency']].loc[row['Product']], axis=1)