Как в pandas наиболее эффективно заполнить столбец данными по ключу и условию?

Рейтинг: 1Ответов: 1Опубликовано: 27.03.2023

Требуется добавить в 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')))

Ответы

▲ 0Принят

Обычным 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' так сопоставить нельзя, непонятно, как вы его сопоставили - у вас нет такого ключа во втором датафрейме ни в каком регистре.