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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:05