2016-12-21 40 views
1

したがって、それぞれに数字を含む6つの列からなる2つのデータフレームがあります。各データフレームの1列を比較して、一致しない列の値を一致させて修正する必要があります。列はすでにソートされており、長さの点で一致します。これまでのところ、私は列の違いを見つけることができます。パンダの2つの列を比較して一致させる

df1.loc[(df1['col1'] != df2['col2'])] 

、私はdf1df2と一致しないインデックス#を取得します。私が不一致を引き起こしているCOL2でどのような値を見つけるためにdf2で同じインデックス#に行くよそして、その後、df2で見つかった正しいものに値を変更するためにこれを使用します。

df1.loc[index_number, 'col1'] = new_value 

は方法私はありますdf2の正しい値を手動で検索することなく、不一致を自動的に修正できますか?

+0

をチェックしなければならない場合は、 'DF1 [DF1!= DF2] = new_value'または類似 – EdChum

+0

を行うことができるはず私はへの道があると確信していますあなたが必要とするものをしなさい。問題はそれが何であるかを説明することです。 df1の最初の列とdf2の2番目の列が必要なのかどうかわかりません。 df2は常に新しい価値の源ですか?どのように動作するべきかの手作りの例を使って投稿を編集することで、混乱を修正することができます。 – piRSquared

答えて

1

私はあなたが試合で使用combine_firstいけない値を追加します。必要ならば、eqとで比較する必要があると思う:すべてのデータフレームで一つの列を比較する必要がある場合は

df1 = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,6,5], 
        'E':[5,3,6], 
        'F':[1,4,3]}) 

print (df1) 
    A B C D E F 
0 1 4 7 1 5 1 
1 2 5 8 6 3 4 
2 3 6 9 5 6 3 

df2 = pd.DataFrame({'A':[1,2,1], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df2) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 1 6 9 5 6 3 

を:

print (df1.eq(df2.A, axis=0)) 
     A  B  C  D  E  F 
0 True False False True False True 
1 True False False False False False 
2 False False False False False False 

print (df1.eq(df1.A, axis=0)) 
     A  B  C  D  E  F 
0 True False False True False True 
1 True False False False False False 
2 True False False False False True 

必要な場合同じ列D

df1.D = df1.loc[df1.D.eq(df2.D), 'D'].combine_first(df2.D) 
print (df1) 

    A B C D E F 
0 1 4 7 1.0 5 1 
1 2 5 8 3.0 3 4 
2 3 6 9 5.0 6 3 

しかし、その後のみdf2からdf1Dに列Dを割り当てることが容易である:

df1.D = df2.D 
print (df1) 
    A B C D E F 
0 1 4 7 1 5 1 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

インデックスが異なる場合は、使用可能性がnumpy arrayへの変換列のvaluesです:

df1.D = df1.D.values 
print (df1) 
    A B C D E F 
0 1 4 7 1 5 1 
1 2 5 8 6 3 4 
2 3 6 9 5 6 3 
+0

両方のdfsの各列を比較するのではなく、各dfの1列を比較するだけです。特定の列に対して.eqメソッドを適用できるようには見えません。 – e9e9s

+0

最後の編集を参照してください。パラメータ 'axis = 0'が必要です – jezrael

+0

だから、それぞれの1列を比較する必要があれば、df1でもaxis = 0を使うことができますか? – e9e9s

1

df2が信頼できるソースの場合は、を確認する必要はありませんが等しい

df1.loc[:, 'column_name'] = df2['column_name'] 

である。しかし、我々は

c = 'column_name' 
df1.loc[df1[c] != df2[c], c] = df2[c] 
関連する問題