python之将数据框插入到另一个数据框中每个组的行中

zhwl 阅读:37 2024-02-27 23:08:18 评论:0

为了清楚起见,我创建了 MRE。

df = pd.DataFrame({ 
    "region": ["Canada", "Korea", "Norway", "China", "Canada", "Korea", "Norway", "China", "Canada", "Korea", "Norway", "China"], 
    "type" :["A", "B", "C", "D", "A", "C", "C", "A", "B", "B", "B", "B"], 
    "actual fees": [1235, 422, 333, 111, 1233, 555, 23, 3, 3,4, 1, 2], 
    "total fee": [2222, 444, 67, 711, 4873, 785, 453, 7, 7,9, 11, 352] 
}) 
 
df_to_insert = pd.DataFrame({ 
    "region":["Canada", "Korea", "Norway", "China"], 
    "users" :[55, 36, 87, 250] 
}) 

所以我的 df 看起来像:

              actual fees   total fee 
region  type         
Canada    A      2             2 
          B      1             1 
China     A      1             1 
          B      1             1 
          D      1             1 

df_to_insert 如下所示:

    region  users 
0   Canada  55 
1   Korea   36 
2   Norway  87 
3   China   250 

现在我要做的是在“类型”列的每个区域的末尾插入“用户”和“实际费用”列下的用户值以及“总费用”列下的区域总和。

所以我想要的数据框如下所示:

              actual fees   total fee 
region  type         
Canada    A      2             2 
          B      1             1 
        Users   55             3 
 
China     A      1             1 
          B      1             1 
          D      1             1 
        Users   250            3   

我希望这已经足够清楚了。如果有什么不清楚的地方,请告诉我。

提前致谢!

请您参考如下方法:

您可以 melt df_to_insert 首先,然后是 concatset_index 用于 MultiIndex,最后是 total fee , groupby 区域并映射回 mlt dataframe

mlt = df_to_insert.melt('region',var_name='type',value_name='actual fees') 
mlt['total fee'] = mlt['region'].map(df.groupby('region')['total fee'].sum()) 
 
out = pd.concat((df,mlt),sort=False).set_index(['region','type']).sort_index(0) 

print(out) 
              actual fees  total fee 
region type                          
Canada A             1235       2222 
       A             1233       4873 
       B                3          7 
       users           55       7102 
China  A                3          7 
       B                2        352 
       D              111        711 
       users          250       1070 
Korea  B              422        444 
       B                4          9 
       C              555        785 
       users           36       1238 
Norway B                1         11 
       C              333         67 
       C               23        453 
       users           87        531 

您可以看到熔体如何工作并帮助连接:

print(df_to_insert.melt('region',var_name='type',value_name='actual fees')) 

   region   type  actual fees 
0  Canada  users           55 
1   Korea  users           36 
2  Norway  users           87 
3   China  users          250 


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号