Python pandas - 按行

时间:2016-11-16 18:22:55

标签: python pandas dataframe

我正在尝试根据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])。

请注意,数据框可能具有不同的形状,并包含多个匹配的行。

2 个答案:

答案 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)

使用numpy广播

pd.DataFrame((df1.values[:, None] == df2.values).all(2),
             pd.Index(df1.index, name='df1'),
             pd.Index(df2.index, name='df2'))

enter image description here