pandas DataFrame从地址列取值填充空位置列及KeyError问题解决
问题原因
- 第一个报错的直接原因是列名拼写错误:你代码中取列写的是
ADDRSS,实际列名是ADDRESS,拼写少了字母E,会直接触发KeyError - 第二个错误是行索引匹配问题:你用
addr[i].LOCATION的写法是根据索引值取行,如果你DataFrame的索引不是默认从0开始的连续整数,或者切片后行索引和你累加的i不一致,就会找不到对应索引触发KeyError - 这种逐行循环修改的写法也不符合pandas的最佳实践,效率低还容易触发链式赋值警告
解决方案
步骤1:统一空值格式
首先把LOCATION列里的空白字符串、带引号的空值转换成pandas标准的NaN格式,方便后续判断:
import pandas as pd import numpy as np # 替换多种形式的空值为标准NaN addr['LOCATION'] = addr['LOCATION'].replace([' ', '" "', ''], np.nan)
步骤2:定义匹配城市列表
把你所有需要识别的城市名称统一维护在列表里,后续新增城市直接修改这个列表即可,不用改逻辑:
# 按匹配优先级排序,靠前的城市优先匹配 CITY_LIST = ['NEW YORK', 'LONDON', 'PRAGUE', 'MANCHESTER']
步骤3:编写城市提取函数
从ADDRESS字段中匹配是否存在目标城市:
def extract_city(address_str): for city in CITY_LIST: if city in address_str.upper(): # 加upper兼容大小写差异 return city return np.nan # 无匹配返回空
步骤4:定向填充空值
只针对2008行及以后、LOCATION为空的行做填充,用pandas官方推荐的loc操作避免索引报错:
# 如果2008是DataFrame的索引值,用这个条件 mask = (addr.index >= 2008) & (addr['LOCATION'].isna()) # 如果你说的2008是行号(不管索引值是多少,第2008个行开始),就用下面这个条件替换上面的mask # mask = (addr.index >= addr.iloc[2008:].index.min()) & (addr['LOCATION'].isna()) addr.loc[mask, 'LOCATION'] = addr.loc[mask, 'ADDRESS'].apply(extract_city)
内容的提问来源于stack exchange,提问作者Deesak
相关产品推荐
相关产品推荐

