Сопоставление имен между двумя столбцами двух фреймов данных и добавление новых столбцов к одному - длительное время вычислений - PullRequest
0 голосов
/ 30 января 2019

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

  • df1 -> Фрейм данных всех городов Германии, их названия и дополнительные данные.
  • df2 -> Фрейм данных всех городов Германии, их долгота и широта

Я написал функцию, которая ищет название города в обоих фреймах данных и возвращает долготу и широту:

def ret_longlat(city_name):

    if sum(df_cities["city"] == city_name) > 0:
        long = df_cities["lon"][df_cities["city"] == city_name].iloc[0]
        lat = df_cities["lat"][df_cities["city"] == city_name].iloc[0]
    else:
        long = 0
        lat = 0
    return long,lat

На следующем шаге я применяю эту функцию ко всем городским названиям df1 и сохраняю результат в новом столбце:

df_result["long"] = df_result["city_names"].apply(lambda x: ret_longlat(x)[0])
df_result["lat"] = df_result["city_names"].apply(lambda x: ret_longlat(x)[1])

Весь этот процесс занимает относительно много времени (я бы сказал,5 минут для 12162 строк).

Есть ли способ улучшить код?

Пример данных:

df1

        city        
1       stadtA  
2       stadtB  
3       stadtu  
4       stadty  
5       stadtX  

df2

    city        lat         lon
14  stadtD      50.611879   12.135526
24  stadtA      48.698890   9.842890
25  stadtC      52.947222   12.849444
26  stadtB      52.867370   12.813750
27  stadtY      52.985000   12.854444

1 Ответ

0 голосов
/ 30 января 2019

Это проблема слияния.Вы можете выполнить слияние влево, а затем заполнить пропущенные значения:

res = pd.merge(df1.rename(columns={'city_names': 'city'}),
               df2[['city', 'long', 'lat']].drop_duplicates('city'),
               how='left', on='city')

res[['long', 'lat']] = res[['long', 'lat']].fillna(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...