Я хочу найти идентификатор моего столбца, равный id1 или id2, затем мы добавляем столбец со значением col3 в F1. иначе НАН.
d = {'id1': ["ABC","ANB","ATB","BTP"],'id2':["XXX","YYY","ZZZ","TTT"], 'Name': ["A1","A2","A3","A4"]}
F1 = pd.DataFrame(data=d)
d = {'id': ["ABC","ANB","ZZZ"], 'col3': [0,1,1]}
F2 = pd.DataFrame(data=d)
Я сделал эту строку кода, но она не дала ожидаемого результата.
pd.concat([F1.merge(F2, left_on='id1', right_on='id'),F1.merge(F2, left_on='id2', right_on='id')], axis=0).drop(['Name','id'], axis=1)
Ожидаемый результат показан на этом рисунке.введите описание изображения здесь
Используйте двойной Series.map
для обоих столбцов с помощью Series
, созданного DataFrame.set_index
, с Series.fillna
для замены отсутствующих значений:
s = F2.set_index('id')['col3']
F1['col3'] = F1['id1'].map(s).fillna(F1['id2'].map(s))
print (F1)
id1 id2 Name col3
0 ABC XXX A1 0.0
1 ANB YYY A2 1.0
2 ATB ZZZ A3 1.0
3 BTP TTT A4 NaN
Подробности:
print (F1['id1'].map(s))
0 0.0
1 1.0
2 NaN
3 NaN
Name: id1, dtype: float64
print (F1['id2'].map(s))
0 NaN
1 NaN
2 1.0
3 NaN
Name: id2, dtype: float64
print(F1['id1'].map(s).fillna(F1['id2'].map(s)))
0 0.0
1 1.0
2 1.0
3 NaN
Name: id1, dtype: float64
Ваше решение должно быть изменено с помощью левого соединения и fillna
:
a = F1.merge(F2, left_on='id1', right_on='id', how='left')['col3']
b = F1.merge(F2, left_on='id2', right_on='id', how='left')['col3']
F1['col3'] = a.fillna(b)
print (F1)
id1 id2 Name col3
0 ABC XXX A1 0.0
1 ANB YYY A2 1.0
2 ATB ZZZ A3 1.0
3 BTP TTT A4 NaN
Последнее, если нужны целые числа в последнем столбце, нужны панды 0.24+ с приведением Int64
:
F1['col3'] = F1['id1'].astype('Int64')
print (F1)
id1 id2 Name col3
0 ABC XXX A1 0
1 ANB YYY A2 1
2 ATB ZZZ A3 1
3 BTP TTT A4 NaN
Спасибо, это работает. можете ли вы объяснить больше, что делает эта строка F1['id1'].map(s).fillna(F1['id2'].map(s)) пожалуйста
@Miss - сопоставляет столбец id1
сериями s, если не совпадают, создаются пропущенные значения. Поэтому при использовании fillna с другим отображением заменяются только отсутствующие значения.
@Miss - добавлены подробности для ответа, чтобы лучше понять, как это работает. Это нормально? Или нужно больше пояснений?
что вы подразумеваете под этим id1 столбца карты по серии s? Спасибо
@Miss - я думаю, что поиск по значениям индекса, проверьте Series.map
для получения дополнительных объяснений.
Спасибо большое
Не могли бы вы поделиться ожидаемым результатом?