2016-12-02 4 views
0

私は以下を達成する方法を見つけようとしています.df1とdf2は2つのサンプルデータフレームです。それらは同じ列を持ちますが、追加された新しい名前、削除された古い名前、または既存のセットのデータに基づいて行データが変更される可能性があります。パンダ:2つのデータフレームの間の変更

DF1:

Col1 Col2 Col3 Col4 Col5 
0  1 ABC 94 xxx apple 
1  1 DEF 24 xxx apple 
2  2 ABC 40 yyy banana 
3  3 ABC 74 zzz pear 
4  3 DEF 43 zzz pear 

DF2:

Col1 Col2 Col3 Col4  Col5 
0  1 ABC 71 xxx  apple 
1  2 PQR 65 yyy  banana 
2  3 ABC 86 zzz  pear 
3  3 DEF 53 zzz  pear 
4  4 PQR 26 mmm pineapple 

出力:

Col1 Col2 Col3 Col4  Col5 
0  1 ABC -23 xxx  apple 
1  1 DEF -24 xxx  apple 
2  2 ABC -40 yyy  banana 
3  2 PQR 65 yyy  banana 
4  3 ABC 12 zzz  pear 
5  3 DEF 10 zzz  pear 
6  4 PQR 26 mmm pineapple 

私はthisを試み、それが言及stackoverflowのリンクが、私は唯一の変更を必要としています特定の列のみに適用可能で、新しいキー(私の例ではCol1)を新しい行に追加するゲッター

ありがとうございました!

+0

を試すことができ、あなたの必要な結果が出力されます:ブロック? –

+0

確かに..これは私が作成した例で、私の問題のすべての側面を扱っていると思います – spiff

答えて

2

あなたはCOL3でDF2-DF1をやっている私の理解あたりとして、あなたはそう

df2.set_index(['Col1', 'Col2', 'Col4', 'Col5']).sub(df1.set_index(['Col1', 'Col2', 'Col4', 'Col5']), fill_value=0).reset_index() 
+0

歓声男!とてもシンプルで、set_index()を理解する必要があります..ありがとう – spiff

+0

喜んでそれは助け.. –

2

識別子は、列C1、C2、C4とC5ある場合は、インデックスとして、それらを設定し、.subを使用することができます。

idx = ['Col1', 'Col2', 'Col4', 'Col5'] 

df2.set_index(idx).sub(df1.set_index(idx), fill_value=0) 
Out[16]: 
          Col3 
Col1 Col2 Col4 Col5   
1 ABC xxx apple  -23.0 
    DEF xxx apple  -24.0 
2 ABC yyy banana -40.0 
    PQR yyy banana  65.0 
3 ABC zzz pear  12.0 
    DEF zzz pear  10.0 
4 PQR mmm pineapple 26.0 

あなたも、最後にreset_indexを呼び出すことができます。

df2.set_index(idx).sub(df1.set_index(idx), fill_value=0).reset_index() 
Out[17]: 
    Col1 Col2 Col4  Col5 Col3 
0  1 ABC xxx  apple -23.0 
1  1 DEF xxx  apple -24.0 
2  2 ABC yyy  banana -40.0 
3  2 PQR yyy  banana 65.0 
4  3 ABC zzz  pear 12.0 
5  3 DEF zzz  pear 10.0 
6  4 PQR mmm pineapple 26.0 
+0

ありがとうVMです。@aakash_makwanaは同じ行を1行でやっていると思いますか?したがって、それを受け入れた – spiff

+0

確かに、1行も可能です。私はこれがもっと読みやすいと思った。どういたしまして。 :) – ayhan

+0

あなたは本当に正しいです、これはより可読です – spiff

関連する問題