2017-02-03 18 views
1

前の質問フィルタリング:ここ 2つのデータフレームを比較し、一致した値に

 ID        Value ID Matched? Value Matched? 
0 AA12 101 BB101 CC01 DD06  1  Yes   Yes 
1 AA12 101 BB101 CC01 DD06  2  Yes   Yes 
2 AA11 102 BB101 CC01 2341 DD07 2  Yes   Yes 
3 AA10 202 BB101 CC01 3451 DD09 3  Yes   Yes 
4 AA13 103 BB101 CC02 1231  4  No   Yes 
5 AA14 203 BB101 CC02 4561  5  Yes   No 

が@MaxUによって書かれたコードです:

print(a) 

    ID        Value 
0 AA12 101 BB101 CC01 DD06  1 
1 AA12 101 BB101 CC01 DD06  2 
2 AA11 102 BB101 CC01 2341 DD07 2 
3 AA10 202 BB101 CC01 3451 DD09 3 
4 AA13 103 BB101 CC02 1231  4 
5 AA14 203 BB101 CC02 4561  5 
print(b) 

    ID        Value 
0 AA12 101 BB101 CC01 1351 DD06 1 
1 AA12 101 BB101 CC01 1351 DD06 2 
2 AA11 102 BB101 CC01 DD07  2 
3 AA10 202 BB101 CC01 3451 DD09 3 
4 AA13 103 BB101 CC02    4 
5 AA14 203 BB101 CC02 4561  6 

所望の出力:私は2つのデータフレームを持ってPandas Compare two dataframes and determine the matched values

を前の投稿から:

私はを達成したい何

  • いずれかのデータフレームは、[ 'ID']から4桁の項目が含まれていない場合は (すなわち、 2341、3451)、私はそれをマッチングプロセスから除外したい。
  • 同じIDが複数回表示される場合は、 ['値']に異なる値を設定できます。

このコードの結果はhereです。残念ながら、それは望ましい結果を達成しません。インデックス3のみが一致します。私はコードを微調整していましたが、次のステップを理解できませんでした。

お時間をいただきありがとうございます。

+1

全体taframeは4桁のIDを持たないといけませんか?またはあなたの例ではインデックス0と1のような4桁のパターンを持たない行だけを除外したいのですか? – Boud

+0

a.IDまたはb.IDのいずれかに4桁が含まれていない場合は、それらの行のIDから取り除きたいと考えています。 – comproch

答えて

1

このお試しください:

最初のletの分割をし、両方のDFでのID列をスタック:

In [248]: d1 = df1.set_index('Value').ID.str.split(expand=True).stack().to_frame('ID').reset_index().rename(columns={'level_1':'idx'}) 
    ...: d2 = df2.set_index('Value').ID.str.split(expand=True).stack().to_frame('ID').reset_index().rename(columns={'level_1':'idx'}) 

In [249]: d1 
Out[249]: 
    Value idx  ID 
0  1 0 AA12 
1  1 1 101 
2  1 2 BB101 
3  1 3 CC01 
4  1 4 DD06 
5  2 0 AA12 
6  2 1 101 
7  2 2 BB101 
8  2 3 CC01 
9  2 4 DD06 
10  2 0 AA11 
11  2 1 102 
12  2 2 BB101 
13  2 3 CC01 
14  2 4 2341 
15  2 5 DD07 
16  3 0 AA10 
17  3 1 202 
18  3 2 BB101 
19  3 3 CC01 
20  3 4 3451 
21  3 5 DD09 
22  4 0 AA13 
23  4 1 103 
24  4 2 BB101 
25  4 3 CC02 
26  4 4 1231 
27  5 0 AA14 
28  5 1 203 
29  5 2 BB101 
30  5 3 CC02 
31  5 4 4561 

In [250]: d2 
Out[250]: 
    Value idx  ID 
0  1 0 AA12 
1  1 1 101 
2  1 2 BB101 
3  1 3 CC01 
4  1 4 1351 
5  1 5 DD06 
6  2 0 AA12 
7  2 1 101 
8  2 2 BB101 
9  2 3 CC01 
10  2 4 1351 
11  2 5 DD06 
12  2 0 AA11 
13  2 1 102 
14  2 2 BB101 
15  2 3 CC01 
16  2 4 DD07 
17  3 0 AA10 
18  3 1 202 
19  3 2 BB101 
20  3 3 CC01 
21  3 4 3451 
22  3 5 DD09 
23  4 0 AA13 
24  4 1 103 
25  4 2 BB101 
26  4 3 CC02 
27  6 0 AA14 
28  6 1 203 
29  6 2 BB101 
30  6 3 CC02 
31  6 4 4561 

今、我々は'not matched'のIDを検索することができます。

In [251]: no_match_idx = d1.loc[~d1.ID.isin(d2.ID), 'idx'].unique() 

In [252]: no_match_idx 
Out[252]: array([4], dtype=int64) 

In [253]: df1['Matched_ID'] = ~df1.index.isin(no_match_idx) 
    ...: df1['Matched_Value'] = df1.Value.isin(df2.Value) 

結果:

In [254]: df1 
Out[254]: 
           ID Value Matched_ID Matched_Value 
0  AA12 101 BB101 CC01 DD06  1  True   True 
1  AA12 101 BB101 CC01 DD06  2  True   True 
2 AA11 102 BB101 CC01 2341 DD07  2  True   True 
3 AA10 202 BB101 CC01 3451 DD09  3  True   True 
4  AA13 103 BB101 CC02 1231  4  False   True 
5  AA14 203 BB101 CC02 4561  5  True   False 
+0

これまで最高のソリューション!私はスタッキングについても学びました!あなたの時間と援助に感謝します! – comproch

+1

@comprocho、私は助けてくれると嬉しいです:-) – MaxU

関連する問題