【问题标题】:Distribute values based on count of string in another dataframe根据另一个数据框中的字符串计数分配值
【发布时间】:2021-07-12 02:31:15
【问题描述】:

我想根据以下状态分配付款:

付款:

  cust_id    name       date  amount
0       A  Edward 2021-01-01    3000
1       B   Henry 2021-01-01    5000
2       C   Ferth 2021-02-01    1000

状态:

  cust_id  contract_id   state1    state2    state3
0       A            1  Alabama    Alaska   Arizona
1       A            2  Indiana   Alabama  Nebraska
2       B            3  Alabama       NaN   Arizona
3       C            4   Alaska  Nebraska       NaN
4       C            5      NaN     Maine  Nebraska

客户可能至少有一份合同,每份合同涵盖不同的状态。每个状态都必须被计算,并且那些出现两次的状态将在计算比率时被计算两次,依此类推。然后该比率将乘以金额以获得每个州的分配金额。

输出:

cust_id    name       date     state     ratio  amount
0       A  Edward 2021-01-01   Alabama  0.333333    1000
1       A  Edward 2021-01-01    Alaska  0.166667     500
2       A  Edward 2021-01-01   Arizona  0.166667     500
3       A  Edward 2021-01-01   Indiana  0.166667     500
4       A  Edward 2021-01-01  Nebraska  0.166667     500
5       B   Henry 2021-01-01   Alabama  0.500000    2500
6       B   Henry 2021-01-01   Arizona  0.500000    2500
7       C   Ferth 2021-02-01    Alaska  0.250000     250
8       C   Ferth 2021-02-01  Nebraska  0.500000     500
9       C   Ferth 2021-02-01     Maine  0.250000     250

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这可以使用df.melt 后跟df.groupbyvalue_countsnormalize=True 来实现,这样我们就可以为每个客户展平状态,并根据出现次数,我们得到每个状态的 pct 份额.然后与支付数据框合并,最后将amount 与 pct 份额相乘,得到新的金额:

    解决方案:

    u = (state.melt(['cust_id','contract_id'],value_name='state')
        .groupby("cust_id")['state'].value_counts(normalize=True)
        .reset_index(name='ratio'))
    
    out = payment.merge(u,on='cust_id')
    out['new_amount'] = out['amount']*out['ratio']
    

    输出:

    print(out)
    
      cust_id    name        date  amount     state     ratio  new_amount
    0       A  Edward  2021-01-01    3000   Alabama  0.333333      1000.0
    1       A  Edward  2021-01-01    3000    Alaska  0.166667       500.0
    2       A  Edward  2021-01-01    3000   Arizona  0.166667       500.0
    3       A  Edward  2021-01-01    3000   Indiana  0.166667       500.0
    4       A  Edward  2021-01-01    3000  Nebraska  0.166667       500.0
    5       B   Henry  2021-01-01    5000   Alabama  0.500000      2500.0
    6       B   Henry  2021-01-01    5000   Arizona  0.500000      2500.0
    7       C   Ferth  2021-02-01    1000    Alaska  0.250000       250.0
    8       C   Ferth  2021-02-01    1000     Maine  0.250000       250.0
    9       C   Ferth  2021-02-01    1000  Nebraska  0.500000       500.0
    

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2020-11-25
      • 1970-01-01
      • 2019-02-17
      相关资源
      最近更新 更多