将值从较小的数据框映射到较大的数据框

时间:2018-07-01 08:47:10

标签: python python-3.x pandas dataframe

我有两个数据框。 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中相对于“页面”和“ 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和熊猫。

1 个答案:

答案 0 :(得分:1)

我认为需要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