2016-11-29 3 views
3

問題があり、解決策を見つけましたが、間違っていると感じています。 おそらく、より正式な方法があります。パンダ(Python) - 条件付きの別のものからデータフレームの列を更新する

問題

私は余分な列を持たずに、既存に関する情報を消去せずにマージしたい2つのデータフレームを持っています。例:

既存のデータフレーム(DF)

A A2 B 
0 1 4 0 
1 2 5 1 

DATAFRAMEは

A A2 B 
0 1 4 2 
1 3 5 2 

は私がdf2dfを更新したいと思います(DF2)マージする場合は、列 'A' と 'A2' に相当します。 結果は(次のようになります。

A A2 B 
0 1 4 2.0 <= Update value ONLY 
1 2 5 1.0 
ここ

が私の解決策ですが、私はそれが本当に良いものではないと思う

import pandas as pd 

df = pd.DataFrame([[1,4,0],[2,5,1]],columns=['A','A2','B']) 

df2 = pd.DataFrame([[1,4,2],[3,5,2]],columns=['A','A2','B']) 

df = df.merge(df2,on=['A', 'A2'],how='left') 
df['B_y'].fillna(0, inplace=True) 
df['B'] = df['B_x']+df['B_y'] 
df = df.drop(['B_x','B_y'], axis=1) 
print(df) 

誰もが行うには良い方法を持っているん おかげ

?!

答えて

7

はい、それはマージせずに行うことができます。

rows = (df[['A','A2']] == df2[['A','A2']]).all(axis=1) 
df.loc[rows,'B'] = df2.loc[rows,'B'] 
+0

シンプルでエレガントです。ありがとう! :) – Lerenn

+0

こんにちは!私は2つの異なるDF(DF1とDF2)を持っており、私はここと同じ問題に直面しています。私はこのソリューションを試しましたが、次のエラーが発生しています: 'ValueError:同じラベルのDataFrameオブジェクトだけを比較できます'。両方のDFのサイズは異なりますが、重要な列には同じラベルが付けられています。なぜこのエラーが発生するのですか?すべて(軸= 1) ' –

+0

列に加えて、行には索引に格納されているlablesもあります(値は= df [SITE_IP、PORT_NAME] == dfLags [[SITE_IP、PORT_NAME]]) 。たとえば、 'df3 = df.copy();とします。 df3.index = ['G'、 'H'] 'と比較すると、df [[A '、' A2 ']] == df3 [[' A '、' A2 ']]'と同じエラーが返されます。したがって、同じ形状であっても、有効な比較はできません。たぶん放送を伴う何気ないトリックがここで助けになるかもしれません。 – Quickbeam2k1

1

あなたはこれを試すことができます:

df.ix[df2.loc[(df['A'] == df2['A']) & (df['A2'] == 
df2['A2']),'B'].index.values,'B'] = \ 
df2.loc[(df['A'] == df2['A']) & (df['A2'] == df2['A2']),'B'] 
+0

Quickbeam2k1のものより少し長いですが、それは仕事をします。ありがとう:) – Lerenn

関連する問題