Левые таблицы соединения (1: n) с использованием Pandas, количество строк остается таким же, как в левой таблице - PullRequest
0 голосов
/ 15 мая 2018

Как я оставляю объединяемые таблицы с отношением 1: n, сохраняя количество строк таким же, как в левой таблице, и объединяя любые дублирующиеся данные с символом / строкой, например ';'.

Пример:
Таблица стран

CountryID      Country      Area
1              UK           1029
2              Russia       8374

Таблица городов

CountryID      City     
1              London           
1              Manchester       
2              Moscow          
2              Ufa   

Я хочу:

CountryID      Country      Area      Cities
1              UK           1029      London;Manchester
2              Russia       8374      Moscow;Ufa

Я знаю, как выполнить нормальный левыйjoin

country.merge(city, how='left', on='CountryID')

, что дает мне четыре строки вместо двух:

Area      Country      CountryID      City
1029      UK           1              London
1029      UK           1              Manchester
8374      Russia       2              Moscow
8374      Russia       2              Ufa

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Это даст вам желаемый результат:

df1.merge(df2, on='CountryID').groupby(['CountryID', 'Country', 'Area']).agg({'City': lambda x: ';'.join(x)}).reset_index()

#   CountryID Country  Area               City
#0          1      UK  1029  London;Manchester
#1          2  Russia  8374         Moscow;Ufa
0 голосов
/ 15 мая 2018

Используйте map от Series, созданного groupby + join для нового столбца в df1, если важна производительность:

df1['Cities'] = df1['CountryID'].map(df2.groupby('CountryID')['City'].apply(';'.join))
print (df1)
   CountryID Country  Area             Cities
0          1      UK  1029  London;Manchester
1          2  Russia  8374         Moscow;Ufa

Detail

print (df2.groupby('CountryID')['City'].apply(';'.join))
CountryID
1    London;Manchester
2           Moscow;Ufa
Name: City, dtype: object

Другое решение с join:

df = df1.join(df2.groupby('CountryID')['City'].apply(';'.join), on='CountryID')
print (df)
   CountryID Country  Area               City
0          1      UK  1029  London;Manchester
1          2  Russia  8374         Moscow;Ufa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...