使用.replace()将邮政编码转换为pandas列中的城市

时间:2017-07-22 06:36:33

标签: python pandas dataframe

我有一列zipcodes,我试图通过使用uszipcode模块转换到城市。我的数据框:

index   Color   Postal_Code
0       blue    10006.0 
1       green   11415.0
2       red     10037.0

我编写了这段代码并使用.replace()来更新列:

def zco():
    for x in zcode['Postal_Code']:
        x = int(x)                          #convert to int because value is float
        city = search.by_zipcode(x)['City'] #Module extracts the city name 
        if city == str(city):               #The module doesn't recognize some zipcodes, thus generating None.This will skip None values.
            str(x).replace(str(x), city)    #replace int value with city
        else: continue

zcode['Postal_Code'] = zcode['Postal_Code'].apply(zco())

但是我收到了一个错误:

  

' NoneType'对象不可调用

为什么?是否有更好的方法来替换和更新列中的邮政编码?

2 个答案:

答案 0 :(得分:2)

主要问题是您没有将正确的可调用内容传递给df.apply,而是调用zco()并返回None,并将 传递给应用

此外,zco必须是可调用的,能够获取单个参数,而不是一次遍历整个列。 df.apply已经解决了这个问题。

您可以使用zcodf.astype之外更快地转换邮政编码:

 zcode['Postal_Code'].fillna(0).astype(int).astype(str).apply(zco)

随后您的zco定义可以缩短为:

def zco(x):
    city = search.by_zipcode(x)['City']  
    return city if city else x  # if city is None for certain zipcodes, take advantage of the truthiness of None

请注意zco的定义发生了重大变化,接受一个参数并且一次只对一个项目进行操作,而不是整行。

或者,您也可以使用df.transform(callable, axis=1)

zcode['Postal_Code'].fillna(0).astype(int).astype(str).transform(zco)

答案 1 :(得分:1)

我认为问题是一些NoneNaN值,因此必须在函数中添加一个if。还有问题无法将NaN强制转换为int

from uszipcode import ZipcodeSearchEngine
search = ZipcodeSearchEngine()

zcode = pd.DataFrame({'Postal_Code':[10006.0, 11415, 10037, 10, np.nan]})
print (zcode)
   Postal_Code
0      10006.0
1      11415.0
2      10037.0
3         10.0
4          NaN

def zco(x):
    if pd.isnull(x):
        return None
    else:
        city = search.by_zipcode(int(x))['City']
        return city if city else x

zcode['City'] = zcode['Postal_Code'].apply(zco)
print (zcode)

   Postal_Code         City
0      10006.0     New York
1      11415.0  Kew Gardens
2      10037.0     New York
3         10.0           10
4          NaN         None

或者如果缺少代码需要None

def zco(x):
    if pd.isnull(x):
        return None
    else:
        city = search.by_zipcode(int(x))['City']
        return city

zcode['City'] = zcode['Postal_Code'].apply(zco)
print (zcode)
   Postal_Code         City
0      10006.0     New York
1      11415.0  Kew Gardens
2      10037.0     New York
3         10.0         None
4          NaN         None

此外,解决方案可以简化:

def zco(x):
    return search.by_zipcode(x)['City']

zcode['City'] = zcode['Postal_Code'].fillna(0).astype(int).apply(zco)
print (zcode)
   Postal_Code         City
0      10006.0     New York
1      11415.0  Kew Gardens
2      10037.0     New York
3         10.0         None
4          NaN         None