基于邮政编码区间填充DataFrame中State列的Python技术问题
解决方法:根据邮编区间批量修改State列
先分析你之前代码的问题
- 两次尝试都错误地把操作对象锁定在
State列,但实际需要依据PostCode列的值做判断,逻辑对象完全搞混了。 - 这个场景根本不需要用正则表达式:正则适合字符串模糊匹配,而你要的是数值区间判断,用正则属于舍近求远,还容易引入语法错误。
- 具体错误:
- 第一种代码里
re.escape(x.startswith('6') == 4)逻辑混乱,x未定义,且startswith('6') ==4是布尔值,正则无法处理这种内容;lambda里的x是State列的值,不是邮编,完全偏离需求。 - 第二种代码里
PostCode = [range(6000,6997)]把range包装成了列表,'|'.join(PostCode)会直接报错(range不能转字符串拼接);且判断条件x in PostCode是检查State值是否在列表里,和邮编无关。
- 第一种代码里
正确实现方式(无需正则,高效简洁)
方法1:布尔索引直接赋值
先确保PostCode是数值类型(如果原数据是字符串,先转换),再用条件筛选修改State:
import pandas as pd # 转换PostCode为数值类型(处理可能的字符串格式邮编) df['PostCode'] = pd.to_numeric(df['PostCode'], errors='coerce') # 筛选邮编在6000-6997之间的行,将State设为"WA" df.loc[(df['PostCode'] >= 6000) & (df['PostCode'] <= 6997), 'State'] = 'WA'
方法2:用np.where批量替换
适合需要保留原State值的场景(不符合条件的行保持原有State):
import pandas as pd import numpy as np df['PostCode'] = pd.to_numeric(df['PostCode'], errors='coerce') df['State'] = np.where( (df['PostCode'] >= 6000) & (df['PostCode'] <= 6997), 'WA', df['State'] # 不符合条件的行保留原State值 )
内容的提问来源于stack exchange,提问作者Jayne
相关产品推荐
相关产品推荐

