我有一列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'对象不可调用
为什么?是否有更好的方法来替换和更新列中的邮政编码?
答案 0 :(得分:2)
主要问题是您没有将正确的可调用内容传递给df.apply
,而是调用zco()
并返回None
,并将 传递给应用
此外,zco
必须是可调用的,能够获取单个参数,而不是一次遍历整个列。 df.apply
已经解决了这个问题。
您可以使用zco
在df.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)
我认为问题是一些None
或NaN
值,因此必须在函数中添加一个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