Как в pandas наиболее эффективно заполнить столбец данными по ключу и условию?
Требуется добавить в df1 столбцы 4 и 5. Заполнить эти столбцы данными из df2 соответственно из столбцов 'id' и 'val2'.
Ключом для заполнения является df1[0] == df2['key'] и df2['val1'] == 'yes'.
Как наиболее эффективно заполнить столбцы в df1 данными из df2 по ключу и условию?
Сейчас эта операция выполняется через циклы for и items(), и при нескольких тысячах строк занимает заметное время.
Для ускорения работы проги, можно ли применить векторизацию и обойтись без перебора строк?
df1 = pd.DataFrame((('NYcity',5,3,10),
('paris',4,8),
('new York',11,None,6),
('minsk',100,2,6),
('Paris',1,8,9),
('london',1,1,5),
('Paris FR',9,3,2)))
df2 = pd.DataFrame({'key': ['NYcity', 'Paris', 'new York', 'Paris FR', 'MINSK'],
'id':['USA_NY_city_0001','FR_Paris_0100','USA_NY_city_0001', 'FR_Paris_0100', 'RB_Minsk_0001'],
'val1':['yes','maybe','yes','yes','no'],
'val2':['klass10','gr1','klass10','gr1','all']})
Датафрейм1 после работы проги:
df1 = pd.DataFrame((('NYcity',5,3,10,'USA_NY_city_0001','klass10'),
('paris',4,8,None,'FR_Paris_0100','gr1'),
('new York',11,None,6,'USA_NY_city_0001','klass10'),
('minsk',100,2,6,None,None),
('Paris',1,8,9,'FR_Paris_0100','gr1'),
('london',1,1,5,None,None),
('Paris FR',9,3,2,'FR_Paris_0100','gr1')))
Ответы (1 шт):
Обычным merge это решается, но чтобы сопоставить города в разном регистре придётся сделать колонки с нормализованным названием города:
df1['city1'] = df1[0].str.lower()
df2['city2'] = df2['key'].str.lower()
df3 = pd.merge(df1, df2[df2['val1'] == 'yes'], left_on='city1', right_on='city2', how='left') \
.drop(columns=['key','val1','city1','city2'])
Но, естественно, 'new York' так сопоставить нельзя, непонятно, как вы его сопоставили - у вас нет такого ключа во втором датафрейме ни в каком регистре.