Цель
Я просмотрел документацию pandas по слиянию , но у меня возник вопрос об эффективном переопределении значений при слиянии «влево». Я могу сделать это просто для одной пары значений (как видно здесь ), но это становится загроможденным при попытке сделать несколько пар.
Настройка
Если я беру следующие кадры данных:
a = pd.DataFrame({
'id': [0,1,2,3,4,5,6,7,8,9],
'val': [100,100,100,100,100,100,100,100,100,100]
})
b = pd.DataFrame({
'id':[0,2,7],
'val': [500, 500, 500]
})
Я могу объединить их:
df = a.merge(b, on=['id'], how='left', suffixes=('','_y'))
чтобы получить
id val val_y
0 0 100 500.0
1 1 100 NaN
2 2 100 500.0
3 3 100 NaN
4 4 100 NaN
5 5 100 NaN
6 6 100 NaN
7 7 100 500.0
8 8 100 NaN
9 9 100 NaN
Я хочу сохранить левые значения там, где правого значения не существует, но, где это возможно, перезаписать правильные значения.
Мой желаемый результат :
id val
0 0 500.0
1 1 100.0
2 2 500.0
3 3 100.0
4 4 100.0
5 5 100.0
6 6 100.0
7 7 500.0
8 8 100.0
9 9 100.0
Моя попытка
Я знаю, что могу сделать это с помощью нескольких строк кода:
df.loc[df.val_y.notnull(), 'val'] = df[df.val_y.notnull()].val_y
df = df.drop(['val_y'], axis = 1)
Или я могу использовать логику из этого вопроса .
Но это становится загроможденным, когда есть несколько пар столбцов, где я хочу применить эту логику.
Например, используя a
и b
ниже:
a = pd.DataFrame({
'id': [0,1,2,3,4,5,6,7,8,9],
'val': [100,100,100,100,100,100,100,100,100,100],
'val_2':[200, 200, 200, 200, 200, 200, 200, 200, 200, 200]
})
b = pd.DataFrame({
'id':[0,2,7],
'val': [500, 500, 500],
'val_2': [500,500,500]
})
Есть ли более быстрый и чистый способ получить желаемый результат?