Сопоставить значения столбцов панд 2-ти фреймов - PullRequest
0 голосов
/ 30 октября 2018

Настройка

У меня есть 2 кадра данных панд:

  1. df_ads: в каждой строке указана информация об одном объявлении о соскабливании жилья, а df_ads['ad_post_code'] содержит почтовый индекс объявления на голландском языке.
  2. df_mapping: сопоставление почтовых индексов и NUTS3 регионов

Мне нужно сопоставить почтовый индекс каждого объявления с его регионом NUTS3.


Dataframes

df_ads['ad_post_code'] выглядит,

0                1567 JA
1                3893 GB
2                5091 BE
3                1087 MB
4                7905 GW
5                5121 ZH

, где len(df_ads['ad_post_code']) = 85447.

df_mapping выглядит,

      CODE NUTS_3
0     1011  NL326
1     1012  NL326
2     1013  NL326
3     1014  NL326
4     1015  NL326
5     1016  NL326

, где len(df_mapping) = 4074, df_mapping['CODE'] отображают первые 4 символа почтового индекса Нидерландов, а df_mapping['NUTS_3'] - регион NUTS3 почтового кода.

Другими словами, почтовый индекс 1011 находится в регионе NUTS3 NL326.


Проблема

Я сделал несколько простых циклов, чтобы отобразить рекламу в df_ads в регионах NUTS3. Тем не менее, я, кажется, не в состоянии написать правильную настройку зацикливания.

nuts3_map = []

# insert postal codes into list
for i in range(0,len(df_ads)):

    postal_code_ad = df_ads['ad_post_code'].iloc[i].split()[0]

    for j in range(0,len(df_mapping)):

        postal_code_map = str(df_mapping['CODE'].iloc[j])

        # check if postal code match
        if postal_code_ad == postal_code_map:

            nuts3_map.append(df_mapping['NUTS_3'].iloc[j])

            break
    continue

Запуск этого дает len(nuts3_map) = 85353 в то время как len(df_ads) = 85448, так что df_ads['nuts3'] = nuts3 дает ValueError: Length of values does not match length of index.

Является ли double for loop самым быстрым способом сделать это? Если да, то как мне исправить цикл for таким образом, чтобы он работал хорошо?

1 Ответ

0 голосов
/ 30 октября 2018

Я бы сначала создал еще один столбец в df_ads:

# If `df_mapping['CODE']` is `int`
df_ads['CODE'] = df_ads['ad_post_code'].apply(lambda x: int(x[:4]))

# If `df_mapping['CODE']` is `str`
# df_ads['CODE'] = df_ads['ad_post_code'].apply(lambda x: x[:4])

Тогда я бы использовал DataFrame.merge для внутреннего слияния двух фреймов данных:

df_ads.merge(df_mapping, left_on='CODE', right_on='CODE', how='inner')

Я позволил себе изменить ваши данные, чтобы создать работоспособный пример:

# df_ads['ad_post_code']
0    1567 JA
1    3893 GB
2    5091 BE
3    1087 MB
4    7905 GW
5    5121 ZH
6    1011 XX

# df_mapping
   CODE NUTS_3
0  1011  NL326
1  1012  NL326
2  1013  NL326
3  1014  NL326
4  1015  NL326
5  1016  NL326
6  1567  XSFDF

Выход:

  ad_post_code  CODE NUTS_3
0      1567 JA  1567  XSFDF
1      1011 XX  1011  NL326

Если каждый код в df_ads['CODE'] существует в df_mapping['CODE'], вы должны получить правильный вывод.

EDIT

Если вы хотите знать, завершен ли список в df_mapping, вы можете сделать это:

df_ads.loc [np.logical_not (df_ads [ 'CODE']. ISIN (df_mapping [ 'CODE']))] * 1 028 *

Отсутствующие данные:

   ad_post_code  CODE
id                   
1       3893 GB  3893
2       5091 BE  5091
3       1087 MB  1087
4       7905 GW  7905
5       5121 ZH  5121
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...