我正在尝试根据pandas数据框中与其他数据框匹配的值来选择行。至关重要的是,我只想匹配行中的值,而不是整个系列中的值。例如:
df1 = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]})
df2 = pd.DataFrame({'a':[3, 2, 1], 'b':[4, 5, 6]})
我想选择df1中的'a'和'b'值与df2中的任何行匹配的行。我试过了:
df1[(df1['a'].isin(df2['a'])) & (df1['b'].isin(df2['b']))]
这当然会返回所有行,因为所有值都存在于某个点的df2中,但不一定是同一行。我如何限制这一点,以便为'b'测试的值只是那些找到值'a'的行?因此,通过上面的示例,我期望只返回行索引1([2,5])。
请注意,数据框可能具有不同的形状,并包含多个匹配的行。
答案 0 :(得分:4)
与this post
类似,此处使用broadcasting
-
df1[(df1.values == df2.values[:,None]).all(-1).any(0)]
这个想法是:
1)使用np.all
代替""both 'a' and 'b' values""
中的 部分。
2)对np.any
中的任意部分使用"from df1 match any row in df2"
。
3)使用broadcasting
通过None/np.newaxis
扩展维度,以矢量化方式执行所有这些操作。
示例运行 -
In [41]: df1
Out[41]:
a b
0 1 4
1 2 5
2 3 6
In [42]: df2 # Modified to add another row : [1,4] for variety
Out[42]:
a b
0 3 4
1 2 5
2 1 6
3 1 4
In [43]: df1[(df1.values == df2.values[:,None]).all(-1).any(0)]
Out[43]:
a b
0 1 4
1 2 5
答案 1 :(得分:0)