2017-03-02 14 views
2

パンダ:上書き列は、私は2つのデータフレーム以下のいる

df1 = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[0,0,1,1,0]}) 
df2 = pd.DataFrame({'ids':[1,5],'cost':[1,4]}) 

をそして私は、IDSでの試合があるたびにDF2上のものとDF1の値を更新します。目的のデータフレームは、次のとおりです。

df_result = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[1,0,1,1,4]}) 

上記2つのデータフレームからどのように取得できますか?

私はマージ使用してみましたが、少ないレコードと、それは両方の列を保持している

results = pd.merge(df1,df2,on='ids') 
results.to_dict() 
{'cost_x': {0: 0, 1: 0}, 'cost_y': {0: 1, 1: 4}, 'ids': {0: 1, 1: 5}} 

答えて

1

あなたはset_indexを使用して、あなたが

ids cost 
0 1 1 
1 2 0 
2 3 1 
3 4 1 
4 5 4 
1

あなたは左マージでこれを行うことができます:あなたがの必要性を回避することができますしかし

merged = pd.merge(df1, df2, on='ids', how='left') 
merged['cost'] = merged.cost_x.where(merged.cost_y.isnull(), merged['cost_y']) 
result = merged[['ids','cost']] 

idsを索引列として設定すると、マージ(およびパフォーマンスが向上します)。その後、パンダはあなたのために結果を揃えるためにこれを使用することができます:

df1 = df1.set_index('ids') 
df2 = df2.set_index('ids') 

df1.cost.where(~df1.index.isin(df2.index), df2.cost) 
ids 
1 1.0 
2 0.0 
3 1.0 
4 1.0 
5 4.0 
Name: cost, dtype: float64 
0

別の取得

df_result = df2.set_index('ids').combine_first(df1.set_index('ids')) 
df_result.reset_index() 

DF2の値に優先権を与えることを最初に組み合わせることができますそれを行うには、使用後に破棄できる一時的な結合データフレームを使用します。

import pandas as pd 

df1 = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[0,0,1,1,0]}) 
df2 = pd.DataFrame({'ids':[1,5],'cost':[1,4]}) 

dftemp = df1.merge(df2,on='ids',how='left', suffixes=('','_r')) 
print(dftemp) 

df1.loc[~pd.isnull(dftemp.cost_r), 'cost'] = dftemp.loc[~pd.isnull(dftemp.cost_r), 'cost_r'] 
del dftemp 

df1 = df1[['ids','cost']] 
print(df1) 


OUTPUT-----: 
dftemp: 
    cost ids cost_r 
0  0 1  1.0 
1  0 2  NaN 
2  1 3  NaN 
3  1 4  NaN 
4  0 5  4.0 

df1: 
    ids cost 
0 1 1.0 
1 2 0.0 
2 3 1.0 
3 4 1.0 
4 5 4.0 
関連する問題