通过匹配两个数据帧的完整行来创建布尔掩码

时间:2019-03-20 05:39:09

标签: python pandas

我有两个数据框,每个数据框包含两列美国州和城镇。我想在第一个数据框中创建一个具有布尔值的新列,该值指示在第二个数据框中是否有与其状态配对的城镇。

示例:

df = pd.DataFrame({'countries':['france', 'germany', 'spain', 'uk', 'norway', 'italy'], 
                   'capitals':['paris', 'berlin', 'madrid', 'london', 'oslo', 'rome']})

df2 = pd.DataFrame({'countries':['france', 'spain', 'uk', 'italy'], 
                   'capitals':['paris', 'madrid', 'london', 'rome']})

df

  countries capitals
0    france    paris
1   germany   berlin
2     spain   madrid
3        uk   london
4    norway     oslo
5     italy     rome

df2

  countries capitals
0    france    paris
1     spain   madrid
2        uk   london
3     italy     rome

我想做的是

df> countries  capitals  bool
    france     paris     True
    germany    berlin    False
    spain      madrid    True
    uk         london    True
    norway     oslo      False
    italy      rome      True

谢谢!

2 个答案:

答案 0 :(得分:3)

使用指示器执行“完全外部联接”。

u = df.merge(df2, how='outer', indicator='bool')
u['bool'] = u['bool'] == 'both'
u

  countries capitals   bool
0    france    paris   True
1   germany   berlin  False
2     spain   madrid   True
3        uk   london   True
4    norway     oslo  False
5     italy     rome   True

在中间步骤中,我们看到

df.merge(df2, how='outer', indicator='bool')

  countries capitals       bool
0    france    paris       both
1   germany   berlin  left_only
2     spain   madrid       both
3        uk   london       both
4    norway     oslo  left_only
5     italy     rome       both

indicator指定该行所在的位置。现在,我们要标记“布尔”显示为“两个”的所有行(以获取预期的输出)。

答案 1 :(得分:-1)

df = pd.DataFrame({'countries':['france', 'germany', 'spain', 'uk', 'norway', 'italy'], 
                   'capitals':['paris', 'berlin', 'madrid', 'london', 'oslo', 'rome']})

df2 = pd.DataFrame({'countries':['france', 'spain', 'uk', 'italy'], 
                   'capitals':['paris', 'madrid', 'london', 'rome']})

df['bool'] = False

# Loop efficiently through pandas data frame
for idx, row in df.iterrows():
    if row.countries in df2.countries.values:
        df.loc[idx, 'bool'] = True 

print(df)
  countries capitals   bool
0    france    paris   True
1   germany   berlin  False
2     spain   madrid   True
3        uk   london   True
4    norway     oslo  False
5     italy     rome   True