2016-11-16 135 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