基于字典部分字符串匹配为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
相关产品推荐
相关产品推荐

