Объединить два фрейма данных и сохранить уникальные столбцы - PullRequest
1 голос
/ 29 сентября 2019

У меня есть два фрейма данных:

1-й дф

#df1 -----

    location            Ethnic Origins       Percent(1)
0   Beaches-East York   English              18.9 
1   Davenport           Portuguese           22.7
2   Eglinton-Lawrence   Polish               12.0

2-й дф

 #df2 -----

    location                                            lat        lng
0   Beaches—East York, Old Toronto, Toronto, Golde...   43.681470   -79.306021
1   Davenport, Old Toronto, Toronto, Golden Horses...   43.671561   -79.448293
2   Eglinton—Lawrence, North York, Toronto, Golden...   43.719265   -79.429765

Ожидаемый результат:

Я хочу использовать столбец местоположения #df1, так как он чище и сохраняет все остальные столбцы. Мне не нужна информация о городе, стране в столбце местоположения.

    location            Ethnic Origins   Percent(1)  lat       lng
0   Beaches-East York   English          18.9        43.681470  -79.306021
1   Davenport           Portuguese       22.7        43.671561  -79.448293
2   Eglinton-Lawrence   Polish           12.0        43.719265  -79.429765

Я пробовал несколько способов объединить их, но безрезультатно.

Возвращает NaN для всех длинных и длинных строк

df3 = pd.merge(df1, df2, on="location", how="left")

Возвращает NaN для всех этнических и процентных рядов

df3 = pd.merge(df1, df2, on="location", how="right")

Ответы [ 3 ]

1 голос
/ 29 сентября 2019

Я предполагаю, что проблема, с которой вы столкнулись, заключается в том, что столбец, с которым вы пытаетесь объединиться, не совпадает, т. Е. Он не находит соответствующие значения в df2.location для слияния с df1. Попробуйте сначала изменить их, и это должно сработать:

df2["location"] = df2["location"].apply(lambda x: x.split(",")[0])
df3 = pd.merge(df1, df2, on="location", how="left")
1 голос
/ 29 сентября 2019

Как уже отмечалось, проблема в том, что столбцы 'location' не имеют общих значений. Одним из решений этой проблемы является использование регулярного выражения, чтобы избавиться от всего, начиная с первой запятой и продолжая до конца строки:

df2.location = df2.location.replace(r',.*', '', regex=True)

Используя предоставленные вами точные данные, это все равно не будет работатьпотому что у вас есть два вида штрихов в фрейме двух данных. Вы можете решить эту проблему аналогичным образом (на этот раз не нужно регулярное выражение):

df2.location = df2.location.replace('—', '-')

А затем объединить, как вы предложили

df3 = pd.merge(df1, df2, on="location", how="left")
1 голос
/ 29 сентября 2019

Мы должны использовать findall создать ключ

df2['location']=df2.location.str.findall('|'.join(df1.location)).str[0]
df3 = pd.merge(df1, df2, on="location", how="left")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...