2017-12-16 14 views
1

pandasに関する非常に具体的な質問があります。私の両方がバイナリで、2つのデータフレームを持っている:一致させるために複数のパターンを含む一つは、言うことができます:NaNを含むパンダで一致する列を見つける

0 : 1,NaN,1,Nan,Nan 
1 : Nan,1,1,Nan,Nan 

0 : 1,0,0,1,0 
1 : 0,0,0,0,1 
2 : 1,0,1,0,0 

実際のデータのレコードを含む1、私は私がライン伝える操作を実行したいですどのレコードのデータが一致するかを示します。この例のルール0はレコード2と一致します。欠損値は何も一致する必要はなく、そこに問題があります。欠損値がなければ、単にpd.merge(df1,df2,how="inner")を使用できますが、内部結合は一致しませんNaNには何もありません。

すべてのループを実行することなくシンプルで洗練されたソリューションがありますか? (明確にするため)を追加する

編集:

この:我々はduplicatedを使用できるバイナリである場合

0 : 1,1,0,0,0 
1 : 1,1,0,0,1 
+0

を投稿することができますか? – Tanu

+0

目的の出力は、2つの行を持つテーブルです.1つは、一致するレコードの行番号を持つものと、一致した列の行番号を持つものです。ルール1,2,3とマッチしたレコード2を知りたい。ルール1,2と一致するレコード15;私はどんなルールにも合致しなかったレコードを見たくない。 – Blackliquid

答えて

2

0 : 1,1,NaN,NaN,NaN 

は、これらの両方と一致する必要があります

あなたが達成したいものを出力0
df=pd.concat([df1.fillna(0),df2],keys=['df1','df2']) 
df[df.astype(int).duplicated(keep=False)] 
Out[37]: 
     1 2 3 4 5 
df1 0 1.0 0.0 1 0.0 0.0 
df2 2 1.0 0.0 1 0.0 0.0 

EDIT

dd=df1.stack().reset_index().groupby('level_0').level_1.apply(list).tolist() 
dd 
Out[67]: [['1', '3'], ['2', '3']] 

df2.apply(lambda x : sum([all(x.loc[y]==1) for y in dd]),1) 

Out[78]: 
0 0 
1 0 
2 1 
dtype: int64 
df2[df2.apply(lambda x : sum([all(x.loc[y]==1) for y in dd]),1)==1] 
Out[80]: 
    1 2 3 4 5 
2 1 0 1 0 0 
+0

私はそれが重複しているのが好きだ! –

+0

それは1,1、ナン、ナン、ナンと1,1,0,0,1トーと一致するでしょうか? – Blackliquid

+0

NaNに0を書き込むので、内部結合と同じ効果があると思います。欠損値が0の場合は一致しますが、欠損値が他の値であっても一致させたいと考えています。指定された値だけが一致するようにルールを一致させる必要があります – Blackliquid

関連する問題