【问题标题】:Python: add values from one dataframe to another (with multiple conditions)Python:将值从一个数据帧添加到另一个数据帧(具有多个条件)
【发布时间】:2018-11-23 15:49:47
【问题描述】:

我有两个数据框 df1 和 df2 看起来像这样:

例子:

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

df1 = pd.DataFrame(x1)

x2 = [{'country': "Afghanistan", 'commodity': 5, 'tariff': 3.5},
      {'country': "Afghanistan", 'commodity': 3, 'tariff': 6.2},
      {'country': "Afghanistan", 'commodity': 1, 'tariff': 9.9},
      {'country': "Afghanistan", 'commodity': 2, 'tariff': 1.4},
      {'country': "USA", 'commodity': 5, 'tariff': 4.3},
      {'country': "Germany", 'commodity': 7, 'tariff': 6.5},
      {'country': "Germany", 'commodity': 2, 'tariff': 8.8}];

df2 = pd.DataFrame(x2)

我想向df1 添加一个名为“关税”的新列,并为df1 中的每个“合作伙伴”和“商品”分配来自df2 的相应“关税”。

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

目前我处于这个阶段:

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

for index, row in df1.iterrows():
    for index, row2 in df2.iterrows():
        if row['partner'] == row2['country']:
            if row['commodity'] == row2['commodity']
                #Dont know what to put here

如果我使用df1['tariff'].replace(row['tariff'],row2['tariff'],inplace=True);,我会得到所有关税栏都填满关税 9.9

df1 的输出应该是这样的:

|  partner   | trade_value | commodity | tariff |
|------------|-------------|-----------|--------|
| Afghanistan|     100     |     1     |   9.9  |
| Zambia     |     110     |     2     |   NaN  |
| Germany    |     120     |     2     |   8.8  |
| Afghanistan|     150     |     2     |   1.4  |
| USA        |     1120    |     5     |   4.3  |

【问题讨论】:

  • 你的预期输出是什么
  • @W-B 我应该为df1 增加一个名为tariff 的列。关税下的值应该根据国家,商品代码在df2...所以基本上我有两个条件添加关税(国家和商品必须匹配)

标签: python pandas dataframe row multiple-columns


【解决方案1】:

merge

您可以简单地使用merge 来连接重叠列上的两个数据框:

pd.merge(left=df1, right=df2, how='left', left_on=['partner', 'commodity'],
         right_on = ['country', 'commodity']).drop(['country'], axis = 1)

     commodity      partner  trade_value  tariff
0          1  Afghanistan          100     9.9
1          2       Zambia          110     NaN
2          2      Germany          120     8.8
3          2  Afghanistan          150     1.4
4          5          USA         1120     4.3

【讨论】:

  • 你应该添加how='left'来保留没有关税的国家
  • 感谢您指出@RickyKim,没有注意到df1中的更多国家/地区
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多