Поскольку строки являются уникальными для региона, вы можете создать словарь, который сопоставляет любое имя в 'VARNAME_1'
с индексом из df_geo
.
Затем используйте это для сопоставления имен в df_data
с фиктивным столбцом, и вы можете выполнить простое объединение индекса в df_geo
и сопоставленного столбца в df_data
.
* 1009.* Чтобы получить словарь, выполните:
d = dict((y,ids) for ids, val in df_geo.VARNAME_1.str.split(r'\\').items()
for y in val)
Пример данных:
import pandas as pd
df_geo = pd.DataFrame({'VARNAME_1': ['Catalogna\Catalogne\Catalonia', 'A\B\C\D\E\F\G']})
df_data = pd.DataFrame({'Name': ['Catalogna', 'Seven', 'E'],
'Vals': [1,2,3]})
Код
d = dict((y,ids) for ids, val in df_geo.VARNAME_1.str.split(r'\\').items()
for y in val)
#{'A': 1,
# 'B': 1,
# 'C': 1,
# 'Catalogna': 0,
# 'Catalogne': 0,
# 'Catalonia': 0,
# 'D': 1,
# 'E': 1,
# 'F': 1,
# 'G': 1}
df_data['ID'] = df_data.Name.map(d)
df_data.merge(df_geo, left_on='ID', right_index=True, how='left').drop(columns='ID')
Вывод:
Name Vals VARNAME_1
0 Catalogna 1 Catalogna\Catalogne\Catalonia
1 Seven 2 NaN
2 E 3 A\B\C\D\E\F\G
Как работает словарь.
df_geo.VARNAME_1.str.split(r'\\').values
разбивает строку в VARNAME_1
на символ '\'
и помещает все разделенные значения в Series
списков.Использование .items
на Series
дает вам кортеж (который мы распаковали в два отдельных значения), причем первое значение - это индекс, который совпадает с индексом исходного DataFrame
, а второй элемент -
for ids, val in df_geo.VARNAME_1.str.split(r'\\').items():
print(f'id:{ids} and val:{val}')
#id:0 and val:['Catalogna', 'Catalogne', 'Catalonia']
#id:1 and val:['A', 'B', 'C', 'D', 'E', 'F', 'G']
Так что теперь val
- это список, который мы снова хотим перебрать, чтобы создать словарь.
for ids, val in df_geo.VARNAME_1.str.split(r'\\').items():
for y in val:
print(f'id:{ids} and y:{y}')
#id:0 and y:Catalogna
#id:0 and y:Catalogne
#id:0 and y:Catalonia
#id:1 and y:A
#id:1 and y:B
#id:1 and y:C
#id:1 and y:D
#id:1 and y:E
#id:1 and y:F
#id:1 and y:G
Итак, я создал словарь с ключом y и исходным индексом DataFrame ids
в качестве значения.