Python中基于邮政编码创建新列及解决AttributeError问题
解决根据邮政编码生成州列的问题及优化方案
先修正你代码里的错误
你的代码有两个问题:
- 当前的
data是Python字典,而apply是pandas DataFrame专属方法,必须先把字典转换成DataFrame才能使用。 - 条件判断里用了位运算符
|,这会导致逻辑错误,正确的多值判断应该用in或者带括号的逻辑或。
修正后的基础可用代码:
import pandas as pd # 将字典转为DataFrame data = {'Name':['Tom', 'nick', 'krish', 'jack', 'Petter'], 'Age':[20, 21, 19, 18, 52], 'Postal Code': [12345, 56789,12345, 96385, 56789]} df = pd.DataFrame(data) # 修正后的州判断函数 def get_state(row): if row['Postal Code'] in (12345, 96385): return 'Utah' # 未匹配到的编码返回空值,可根据需求修改 return None # 生成State列 df['State'] = df.apply(get_state, axis=1)
针对大型数据集的高效方案
逐行执行的apply在数据量较大时效率极低,推荐使用向量化操作,速度能提升几十甚至上百倍:
方法1:isin + numpy.where(适合简单匹配场景)
import pandas as pd import numpy as np df = pd.DataFrame(data) # 定义归属Utah的邮政编码集合 utah_postals = {12345, 96385} # 向量化赋值,直接对整列操作 df['State'] = np.where(df['Postal Code'].isin(utah_postals), 'Utah', None)
方法2:字典映射(扩展性最强)
如果后续需要添加更多州的邮政编码映射,用字典是最方便的,且效率极高:
import pandas as pd df = pd.DataFrame(data) # 构建邮政编码到州的映射字典 postal_state_map = { 12345: 'Utah', 96385: 'Utah', 56789: 'California' # 示例:新增其他州的编码映射 } # 用map方法批量生成State列,未匹配的编码返回空值 df['State'] = df['Postal Code'].map(postal_state_map)
方法3:replace(适合批量替换场景)
和字典映射逻辑类似,语法更简洁:
import pandas as pd df = pd.DataFrame(data) postal_state_map = { 12345: 'Utah', 96385: 'Utah' } df['State'] = df['Postal Code'].replace(postal_state_map)
运行上述任意一种高效方案后,你都能得到期望的结果,比如Tom对应的State列会显示Utah。
内容的提问来源于stack exchange,提问作者Leonardo Urbiola
相关产品推荐
相关产品推荐

