Могу ли я объединить два фрейма данных, используя один столбец в df1 и одно из значений в ячейке в df2? - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю с некоторыми геопространственными данными, df_geo, и у меня есть CSV значений, которые я хотел бы присоединить к фрейму данных местоположения, который называется df_data.

Однако моя проблемав том, что есть несколько способов записать значения в столбце, на котором я хотел бы соединить два фрейма данных (имена регионов).Посмотрите на пример Каталонии ниже, в df_geo: есть 6 различных способов написания названия региона , в зависимости от языка.

enter image description here

У меня такой вопрос: если строка называется «Каталония» в df_data, как мне присоединиться к df_data к df_geo?

1 Ответ

0 голосов
/ 21 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...