Python: 将一个DataFrame的值添加到另一个DataFrame的某些行

3

我有一个名为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中添加一个名为“distance”的新列,并将df1中的每个“partner”与其在df2中相应的“distance”进行匹配。
注意:由于多次贸易,df1中的某些“partner”国家可能会重复。此外,并非所有距离都在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,这是阿富汗和英国之间虚构的距离,但其他一些国家也得到了相同的值(有些国家甚至不应该得到任何值)。

1个回答

4

如果我理解正确,你可以使用.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

1
你真是救命恩人,我刚在我的实际数据框上测试了一下,它不仅有效,而且只用了不到一秒钟的时间。 - Hassan Dbouk
@HassanDbouk map 相对于其他替代方案运行速度更快。 - Abhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接