2017-03-02 2 views
2

Ich habe folgende zwei Datenrahmen:Überschreiben Spalten in Datenrahmen in verschiedenen Größen Pandas

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

Und ich möchte die Werte von DF1 mit denen auf df2 aktualisieren, wenn es eine Übereinstimmung in den ids ist. Der gewünschte Datenrahmen lautet wie folgt:

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

Wie kann ich das von den obigen zwei Datenrahmen bekommen?

Ich habe versucht, verschmelzen mit, aber weniger Datensätze und es hält beiden Spalten:

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}} 

Antwort

1

Sie set_index verwenden können, und zuerst geben Vorrang Werte in df2

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

Sie erhalten

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

Sie können dies tun, mit einem linken merge:

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']] 

auch immer Sie die Notwendigkeit für die vermeiden können, Zusammenführen (und bessere Leistung), wenn Sie die IDs als Indexspalte festlegen; dann kann Pandas diese verwenden, um die Ergebnisse für Sie ausrichten:

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

Ein weiteres kombinieren Möglichkeit, dies zu tun, mit einem temporären zusammengeführten Datenrahmen, den Sie nach der Verwendung verwerfen können.

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 
Verwandte Themen