Python:将一个数据帧的值添加到另一个数据帧的某些行中

Python:将一个数据帧的值添加到另一个数据帧的某些行中,python,pandas,dataframe,replace,row,Python,Pandas,Dataframe,Replace,Row,我有一个数据框df1,它保存某个国家和英国之间数千笔交易的行。我还有另一个数据帧df2,它保存了某些国家和英国之间的距离的几行数据 例如: x1 = [{'partner': "Afghanistan", 'trade_value':100}, {'partner':"Zambia",'trade_value':110}, {'partner': "Germany",'trade_value':120}, {'partner': "Afghanistan"

我有一个数据框
df1
,它保存某个国家和英国之间数千笔交易的行。我还有另一个数据帧
df2
,它保存了某些国家和英国之间的距离的几行数据

例如:

x1 = [{'partner': "Afghanistan", 'trade_value':100}, 
      {'partner':"Zambia",'trade_value':110}, 
      {'partner': "Germany",'trade_value':120},
      {'partner': "Afghanistan",'trade_value':150},
      {'partner': "USA",'trade_value':1120}]

df1 = pd.DataFrame(x1)

x2 = [{'country': "Afghanistan", 'distance':1000}, 
      {'country': "USA",'distance':1120}];

df2 = pd.DataFrame(x2)
我想在
df1
中添加一个名为“距离”的新列,并为
df1
中的每个“合作伙伴”分配其与
df2
的适当“距离”

注:有时由于多次交易,df1中的“合作伙伴”国家/地区会重复出现。而且,并非所有距离都在
df2
中可用,因此我不介意将df1中的单元格留空

到目前为止,我尝试这一点都没有用:

#Add new column
df1['distance'] = 0;

for index, row in df1.iterrows():
    for index, row2 in df2.iterrows():
        if row['partner'] == row2['country']:
            df1['distance'].replace(row['distance'], row2['distance'],inplace=True);
我用1000填充了所有的距离栏,这是阿富汗和英国之间的弥补距离,但所有其他国家都得到了相同的值(有些国家甚至不应该得到任何值)

IIUC您可以使用


你是一个救生员,我刚刚在我的实际数据帧上测试了它,它不仅有效,而且花费了不到一个小时的时间second@HassanDbouk
map
与其他备选方案相比工作速度更快。
x1 = [{'partner':"Afghanistan", 'trade_value':100}, {'partner':"Zambia",'trade_value':110},
      {'partner': "Germany",'trade_value':120},
      {'partner': "Afghanistan",'trade_value':150},{'partner': "USA",'trade_value':1120}]

df1 = pd.DataFrame(x1)

x2 = [{'country': "Afghanistan", 'distance':1000}, {'country': "USA",'distance':1120}]

df2 = pd.DataFrame(x2)

df1['distance'] = df1['partner'].map(df2.set_index('country')['distance'])

print (df1)

       partner  trade_value  distance
0  Afghanistan          100    1000.0
1       Zambia          110       NaN
2      Germany          120       NaN
3  Afghanistan          150    1000.0
4          USA         1120    1120.0