大熊猫的条件总结

时间:2015-11-30 16:06:20

标签: python pandas

我有一个名为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个总数。

请帮忙。

2 个答案:

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