首页 > 解决方案 > 将值从小数据帧映射到大数据帧

问题描述

我有两个数据框。DF1:

Page      LineNum      Value
1          1            0.5
1          2            0.6
1          3            0.7
2          1            0.9
2          2            0.4

DF2:初始数据框是前三列,我必须生成名为 New_Value 的第四列。

Page      LineNum      Word    New_Value
1          1            g1      0.5
1          1            g2      0.5
1          1            g3      0.5
1          1            g4      0.5
1          2            g5      0.6
1          2            g6      0.6
1          3            g7      0.7
1          3            g8      0.7
...

我必须生成 DF2 的第四列,它实际上是从 DF1 的唯一“Page”和“LineNum”值映射的。在 DF2 中,这些值只是根据 DF1 中关于“Page”和“LineNum”的唯一值重复。

我目前正在通过 for 循环执行此操作:

    for index, row in DF1.iterrows():
        DF2.ix[((DF2['Page'] == row['Page']) & (DF2['LineNum'] == row['LineNum'])),['New_Value']] = row['Value']

这工作得很好,但是两个数据框都非常大。所以我需要一些优化的功能,也许使用 groupby 和 lambda 但无法设计出确切的功能。

请建议一个没有 For 循环的优化版本。如果我需要对此进行解释,请发表评论。我正在使用 Python3 和熊猫。

标签: pythonpython-3.xpandasdataframe

解决方案


我认为需要merge左连接:

df = (df2.merge(df1.rename(columns={'Value':'New_Value'}),
                on=['Page','LineNum'], how='left'))
print (df)

   Page  LineNum Word  New_Value
0     1        1   g1        0.5
1     1        1   g2        0.5
2     1        1   g3        0.5
3     1        1   g4        0.5
4     1        2   g5        0.6
5     1        2   g6        0.6
6     1        3   g7        0.7
7     1        3   g8        0.7

推荐阅读