我有两个数据框。 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和熊猫。
答案 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