2016-11-16 138 views
2

我试图在基于匹配的另一个数据帧的它的值的熊猫数据帧来选择行。最重要的是,我只想匹配行中的值,而不是贯穿整个系列。例如:Python的大熊猫 - 选择通过

df1 = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]}) 

df2 = pd.DataFrame({'a':[3, 2, 1], 'b':[4, 5, 6]}) 

我想选择排在那里都“a”和“B”从DF1比赛中DF2任何行值。我曾尝试:

df1[(df1['a'].isin(df2['a'])) & (df1['b'].isin(df2['b']))] 

这当然将返回所有行,因为所有的值出现在在某些时候DF2,但不一定在同一行。我如何限制这个值,以便测试'b'的值只是那些值为'a'的行?所以对于上面的例子,我期待只返回行索引1([2,5])。

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

回答

3

类似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 
+0

这工作,我从来没有会工作这一点我自己,谢谢。我很惊讶没有现有的熊猫功能来执行此操作。 – ssast

+0

@ssast即使NumPy没有内置的这个。有一个非常相关的['问答'](http://stackoverflow.com/questions/38674027/find-the-row-indexes-of-several-values-in-a-numpy-array)研究其他更有效的解决方案找到行索引。那里看起来很好看! – Divakar

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