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

基于字典部分字符串匹配为DataFrame新增列的问题求助

从推文提取城市信息的Pandas函数适配

问题分析

你的原代码在推文都能匹配到hasDict中的城市标签时可以正常运行,但遇到无匹配项的推文时,会触发IndexError: list index out of range。原因是lambda表达式里的列表推导式[hasDict[city] for city in hasDict if city in x]会返回空列表,此时取索引[0]就会报错——这和DataFrame条目数是否多于字典无关,只是新增的Hello #PE刚好不在字典的键里才暴露了问题。

你的解决方案验证

你给出的这段代码是可行的,针对你的两个疑问解答如下:

1. str.extract的正则用法解析

'('+'|'.join(hasDict.keys())+')' 做了这几件事:

  • 用'|'把hasDict的所有键(比如#JHB、#CPT)拼接成正则选择分支,形成#JHB|#CPT
  • 外层加括号把整个分支变成捕获分组,这样str.extract会提取到匹配的标签内容
  • expand=False指定返回Series格式,方便后续和原DataFrame拼接

str.extract会在每条推文中查找第一个匹配的城市标签,提取出标签字符串,再通过map(hasDict)把标签映射成对应的城市名称,最后用fillna(np.nan)填充无匹配的情况。

2. 是否需要导入regex库?

不需要。Pandas的str系列方法默认使用Python标准库的re模块,不需要额外导入第三方regex库,完全符合你作业只导入pandas和numpy的要求。

完整可运行代码

import pandas as pd
import numpy as np

def extract_city(df, has_dict):
    # 构建正则表达式,匹配字典中的城市标签
    pattern = '(' + '|'.join(has_dict.keys()) + ')'
    # 提取标签、映射城市名、填充空值
    df['City'] = df['Tweets'].str.extract(pattern, expand=False).map(has_dict).fillna(np.nan)
    return df

# 测试案例
details = {'Tweets':['Whatever #JHB', 'Yes #CPT', 'Hello #PE']}
df = pd.DataFrame(details)
hasDict = {'#JHB':'JHB','#CPT':'CPT'}

df = extract_city(df, hasDict)
print(df)

运行输出:

Tweets  City
0  Whatever #JHB   JHB
1       Yes #CPT    CPT
2       Hello #PE   NaN

内容的提问来源于stack exchange,提问作者Phillippa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:00:13