Python 熊猫为循环,工作于小数据帧挂起于大数据帧

Python 熊猫为循环,工作于小数据帧挂起于大数据帧,python,pandas,Python,Pandas,我正在使用一个邮政编码表为choroplot创建一个县表。当我给它一个小的玩具示例时,我的代码工作得很好,但是当我给它数据帧时,它挂断了。我无法共享数据帧,但它是+/-70000个邮政编码,编码为字符串,值可以是正确的zipcode、非数字字符串或不是正确zipcode的数字字符串,每一个都是字符串格式。代码如下: # import libraries import numpy as np import pandas as pd # load customer email table df =

我正在使用一个邮政编码表为choroplot创建一个县表。当我给它一个小的玩具示例时,我的代码工作得很好,但是当我给它数据帧时,它挂断了。我无法共享数据帧,但它是+/-70000个邮政编码,编码为字符串,值可以是正确的zipcode、非数字字符串或不是正确zipcode的数字字符串,每一个都是字符串格式。代码如下:

# 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多个小时,考虑到数据的大小,这是完全不合理的。我一定是用错了什么东西,如何加快处理速度?有人建议使用散列函数,这是最好的选择吗

您可以完全不使用循环和函数,只需合并ZipCode列上的数据集:

new_df = pd.merge(df, zc, how="left", left_on="ZipCode", right_on="ZipCode")

你能分享一些你的数据帧样本吗。这看起来像是一个典型的映射问题,比如
df['ZipCode'].map(zc.set_index(0)[1])
有什么原因不能在这两个数据帧之间进行某种连接吗?我不熟悉.map()。我现在来调查一下。我以前尝试过使用join命令,但没有成功。我使用了下面的解决方案,但不起作用。我怀疑这是因为两个ZipCode列具有不同的数据类型。我现在正在把一个换成另一个,这样就把NaN留在了整个郡的列中。zc中的ZipCode列存储为,df中的ZipCode列存储为,这有什么关系?@user40551是的,这可能就是为什么-您可以使用
df[“ZipCode”]=df[“ZipCode”].astype(int)
将其转换为相同的数据类型。@user40551实际上我刚刚测试过,您可以将浮点列与int列合并,因此,假设两个DFs之间存在一些匹配的ZipCode值,那么合并应该在不转换数据类型的情况下工作。如果您仍然有问题,我建议发布一个示例,其中有两个数据框中的几行来自我的数据库:
22 NaN
51 33131
56 90291-391
112 Tamarac,Fl 33321
121 Ponce,PR 00716
这些来自我使用的ZipCode表:
ZipCode地名州名缩写县纬度经度
0501纽约州萨福克霍尔茨维尔40.8154-73.04511544纽约州萨福克霍尔茨维尔40.8154-73.0451
21001马萨诸塞州阿加瓦姆市马萨诸塞州汉普顿42.0702-72.6227
Hmm您的zipcode文件似乎没有存储完整的邮政编码-例如501不是长岛的邮政编码,它是11501(我碰巧知道!),因此您可能需要先更正此文件中的数据,以便邮政编码格式匹配。。。