如何将两个不同形状的数据帧相乘

时间:2021-05-31 15:25:21

标签: python python-3.x pandas dataframe

我有两个数据框:

第一个数据框 df1 如下所示:

    variable            value
0   plastic             5774
2   glass               42
4   ferrous metal       642
6   non-ferrous metal   14000
8   paper               4000

这是第二个数据帧df2的头部:

waste_type           total_waste_recycled_tonne   year   energy_saved
non-ferrous metal    160400.0                     2015    NaN
glass                14600.0                      2015    NaN
ferrous metal        15200                        2015    NaN
plastic              766800                       2015    NaN

我想更新第二个数据帧 energy_saved 中的 df2,这样我将 df2 中的 total_waste_recycled_tonne 变量乘以 df1 中的变量到 df2 中的 energy_saved 列中.

例如:

对于塑料:5774 将与 df2 中的 waste_type 变量的每个 platic total_waste_recycled_tonne 相乘

即: energy_saved = 5774 * 766800

这是我尝试过的:

df2["energy_saved"] = df1[df1["variable"]=="plastic"]["value"].values[0] * df2["total_waste_recycled_tonne"][df2["waste_type"]=="plastic"]

然而问题是当我做其他的时候,其余的又变回了NaN。我需要更好的方法来处理这个问题吗?

3 个答案:

答案 0 :(得分:1)

尝试通过 merge() 并通过 how='right'

df=df1[['variable','value']].merge(df2[['waste_type','total_waste_recycled_tonne']],left_on='variable',right_on='waste_type',how='right')

最后:

df2["energy_saved"]=df['value'].mul(df['total_waste_recycled_tonne'])

df2 的输出:

    waste_type          total_waste_recycled_tonne  year    energy_saved
0   non-ferrous metal   160400.0                    2015    2.245600e+09
1   glass               14600.0                     2015    6.132000e+05
2   ferrous metal       15200.0                     2015    9.758400e+06
3   plastic             766800.0                    2015    4.427503e+09
4   plastic             762700.0                    2015    4.403830e+09

答案 1 :(得分:1)

使用map

df2['energy_saved'] = (df2['waste_type'].map(df1.set_index('variable')['value'])
                          .mul(df2['total_waste_recycled_tonne']
                      )

答案 2 :(得分:1)

set_index + reindex 选项:

df2['energy_saved'] = (
        df1.set_index('variable').reindex(df2['waste_type'])['value'] *
        df2.set_index('waste_type')['total_waste_recycled_tonne']
).values

df2

          waste_type  total_waste_recycled_tonne  year  energy_saved
0  non-ferrous metal                    160400.0  2015  2.245600e+09
1              glass                     14600.0  2015  6.132000e+05
2      ferrous metal                     15200.0  2015  9.758400e+06
3            plastic                    766800.0  2015  4.427503e+09
4            plastic                    762700.0  2015  4.403830e+09