【问题标题】:Pandas - split one row value and merge with multiple rowsPandas - 拆分一行值并与多行合并
【发布时间】:2023-02-22 17:43:26
【问题描述】:

我有两个数据框如下

proj_df = pd.DataFrame({'reg_id':[1,2,3,4,5,6,7],
                              'partner': ['ABC_123','ABC_123','ABC_123','ABC_123','ABC_123','ABC_123','ABC_123'],
                              'part_no':['P123','P123','P123','P123','P123','P123','P123'],
                              'cust_info':['Apple','Apple','Apple','Apple','Apple','Apple','Tesla'],
                              'qty_1st_year':[100,100,600,150,50,0,10]})

order_df = pd.DataFrame({'partner': ['ABC_123','ABC_123','JKL_123','MNO_123'],
                         'part_no':['P123','P123','Q123','P567'],
                         'cust_info':['Apple','Hyundai','REON','Renault'],
                         'order_qty':[1000,600,50,0]})

我想做以下

a) 合并两个基于partner,part_no,cust_info的dataframes

b) 将order_qty 列从order_df 中拆分出来,并将适当的部分分配给名为assigned_qty 的新列

c) 适当的部分由qty_1st_year的百分比分配决定。意思是,对于每组partner,part_no and cust_info,您将个人qty_1st_year值除以Qty_1st_year的总和。

所以,我尝试了以下

sum_df = proj_df.groupby(['partner','part_no','cust_info'])['qty_1st_year'].sum().reset_index()
sum_df.columns = ['partner','part_no','cust_info','total_qty_all_project']

t1=proj_df.merge(order_df,on=['partner','part_no','cust_info'],how='left')
t2 = t1.merge(sum_df,on=['partner','part_no','cust_info'],how='left')
t2['pct_value'] = (t2['qty_1st_year']/t2['total_qty_all_project'])*100
proj_df['assigned_value'] = (t2['order_qty']*t2['pct_value'])/100

虽然这似乎工作正常,但我想知道是否有其他更好、更优雅的方法来完成这项任务。

我希望我的输出如下所示

【问题讨论】:

    标签: python pandas list dataframe group-by


    【解决方案1】:

    使用GroupBy.transformsum作为新列以避免双重合并,最后如果需要在乘法和除法后删除列添加DataFrame.pop,最后如果需要除以10以获得预期输出:

    proj_df['total_qty'] = (proj_df.groupby(['partner','part_no','cust_info'])['qty_1st_year']
                                   .transform('sum'))
    
    df=proj_df.merge(order_df,on=['partner','part_no','cust_info'],how='left')
    
    df['assigned_value'] = (df.pop('order_qty')*
                           (df['qty_1st_year']/
                           df.pop('total_qty'))).div(10)
    print (df)
       reg_id  partner part_no cust_info  qty_1st_year  assigned_value
    0       1  ABC_123    P123     Apple           100            10.0
    1       2  ABC_123    P123     Apple           100            10.0
    2       3  ABC_123    P123     Apple           600            60.0
    3       4  ABC_123    P123     Apple           150            15.0
    4       5  ABC_123    P123     Apple            50             5.0
    5       6  ABC_123    P123     Apple             0             0.0
    6       7  ABC_123    P123     Tesla            10             NaN
    

    【讨论】:

      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 2016-07-21
      • 2022-10-16
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 2020-10-11
      • 2023-04-02
      相关资源
      最近更新 更多