2016-05-16 5 views
1

私は以下の構造のデータフレームを持っています。私は2つの行を比較するときに(特定の値の)同じ値を持つ列番号を取得したい。Pythonのデータフレーム内の2つの行を比較するときに共通の列を見つける

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 

私はそれに1を有する列を取得するために2つの行を比較するために上記のサンプルDFを使用する場合、私は、行(0)を比較する際に、例えば、私がCOL(1)、COL(3)を取得する必要がありと行(1)。同様に、行(1)と行(2)を比較すると、col(1)を取得する必要があります。私はPythonでより効率的なソリューションがあるかどうかを知りたい。

NB:一致する列番号のみを入力し、比較する行を指定します。

+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])) 

は、両方の行で1秒を持っている列を返します。乗算の方が速いようです。

%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]

関連する問題