You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中基于邮政编码创建新列及解决AttributeError问题

解决根据邮政编码生成州列的问题及优化方案

先修正你代码里的错误

你的代码有两个问题:

  1. 当前的data是Python字典,而apply是pandas DataFrame专属方法,必须先把字典转换成DataFrame才能使用。
  2. 条件判断里用了位运算符|,这会导致逻辑错误,正确的多值判断应该用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:24:26