2016-05-16 27 views
1

我有一個下面結構的數據框。當我比較兩行時,我想獲得具有相同值(對於特定值)的列數。在python中比較數據框中的兩行時尋找公共列

1 1 0 1 1 
0 1 0 1 0 
0 1 0 0 1 
1 0 0 0 1 
0 0 0 0 0 
1 0 0 0 1 

因此,例如,當我使用上述樣品DF來比較兩行獲得,其在具有1的列,我應該得到欄(1)和col(3)當我比較行(0)和行(1)。同樣,當我比較行(1)和行(2)時,我應該得到col(1)。我想知道在Python中是否有更高效的解決方案。

注意:我只需要匹配的列號,我也會指定要比較的行。

+0

你想要的列數,或在退還全列? – ayhan

+0

列號... – tanay

+0

你想要所有的配對比較還是要指定要比較哪些行? – ayhan

回答

3

考慮下面的數據框:

import numpy as np 
df = pd.DataFrame(np.random.binomial(1, 0.2, (2, 10000))) 

這將是大小2x10000的二進制矩陣。

np.where((df.iloc[0] * df.iloc[1])) 

或者,

np.where((df.iloc[0]) & (df.iloc[1])) 

返回具有了兩行1S列。乘法似乎更快:

%timeit np.where((df.iloc[0]) & (df.iloc[1])) 
1000 loops, best of 3: 400 µs per loop 

%timeit np.where((df.iloc[0] * df.iloc[1])) 
1000 loops, best of 3: 269 µs per loop 
+0

NP是numpy .... – tanay

+0

啊,是的,編輯。 – ayhan

0

這是一個簡單的函數。您可以根據需要對其進行修改,具體取決於您如何表示數據。我假設列表的列表:

df = [[1,1,0,1,1], 
     [0,1,0,1,0], 
     [0,1,0,0,1], 
     [1,0,0,0,1], 
     [0,0,0,0,0], 
     [1,0,0,0,1]] 

def compare_rows(df,row1,row2): 
    """Returns the column numbers in which both rows contain 1's""" 
    column_numbers = [] 
    for i,_ in enumerate(df[0]): 
     if (df[row1][i] == 1) and (df[row2][i] ==1): 
      column_numbers.append(i) 
    return column_numbers 

compare_rows(df,0,1)產生輸出:

[1,3]