pandas for loop, работает на небольших датафреймах, зависает на больших - PullRequest
0 голосов
/ 21 мая 2018

Я использую таблицу почтовых индексов, чтобы создать таблицу округов для хороплота.Мой код работает нормально, когда я даю ему небольшой игрушечный пример, но когда я даю ему фрейм данных, он зависает.Я не могу поделиться кадром данных, но это +/- 70 000 почтовых индексов, закодированных в виде строк, и значения могут быть правильными почтовыми индексами, не числовой строкой или числовой строкой, которая не является правильным почтовым индексом, каждый в строковом формате.Это код:

# import libraries
import numpy as np
import pandas as pd

# load customer email table
df = pd.read_csv('customer_April2018.csv', encoding='latin-1')

# load zip code table
zc = pd.read_csv('us_postal_codes.csv', encoding='latin-1')

def zip_toCounty(zip):
    for i, row in zc.iterrows():
        try:
            if int(zip) == zc['ZipCode'].loc[i] : return zc['County'].loc[i]    
        except ValueError : return 'No County'
    return 'No County'

g = lambda s : zip_toCounty(s)

df['County']=df['ZipCode'].apply(g)

df.to_csv('join_test.csv',index=False)

Я не получаю ошибок, но предполагаемое время завершения составляет более 40 часов, что совершенно неразумно, учитывая размер данных.Я должен использовать что-то не так, как я могу ускорить обработку?Один человек предложил хэш-функцию, это лучший вариант здесь?

1 Ответ

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

Вы можете обойтись без цикла и функции в целом и просто объединить наборы данных в столбце ZipCode:

new_df = pd.merge(df, zc, how="left", left_on="ZipCode", right_on="ZipCode")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...