如何在Pandas DataFrame中使用str.contains获取匹配子串值
如何使用str.contains在DataFrame中提取所有匹配目标的元素并整理为单个Series
要实现未知目标列的情况下,用正则匹配(忽略大小写)提取所有匹配值并转为单个Series,可以按以下方式处理:
问题分析
原代码使用df.where(mask)会保留DataFrame的原有结构,仅在匹配位置保留值,其余填充NaN,无法直接得到所有匹配值的一维Series。我们需要遍历所有列,筛选出每个列中符合条件的元素,再合并成目标格式。
解决方案代码
方法一:遍历列筛选匹配项
import pandas as pd import re df = pd.DataFrame({"Name": ['Philip', 'Jana', 'Kate', 'John K.', 'Jonhatan'], "City": ['NewYork', 'New jearsey', 'Mexico City', 'Lisbon', 'Bahia'], "Language": ['English', 'english', 'Spanish, Dutch, German', 'Spanish and English', 'Portuguese, English'], "Years": [24, 27, 29, 40, 61] }) search = 'english' matches = [] # 遍历所有列,提取匹配元素 for col in df.columns: # 将列转为字符串类型,避免数值列报错,同时做不区分大小写的正则匹配 matched_vals = df[col].astype(str)[df[col].astype(str).str.contains(search, flags=re.I)] matches.extend(matched_vals.tolist()) # 转换为目标格式的Series result_series = pd.Series(matches) print(result_series)
方法二:列表推导式简化写法
import pandas as pd import re df = pd.DataFrame({"Name": ['Philip', 'Jana', 'Kate', 'John K.', 'Jonhatan'], "City": ['NewYork', 'New jearsey', 'Mexico City', 'Lisbon', 'Bahia'], "Language": ['English', 'english', 'Spanish, Dutch, German', 'Spanish and English', 'Portuguese, English'], "Years": [24, 27, 29, 40, 61] }) search = 'english' # 嵌套推导式遍历所有列和元素,筛选匹配项 matches = [val for col in df.columns for val in df[col].astype(str) if re.search(search, val, flags=re.I)] result_series = pd.Series(matches) print(result_series)
代码说明
- 两种方法都会遍历DataFrame的所有列,将列元素转为字符串类型(兼容数值列),通过
str.contains或re.search实现不区分大小写的正则匹配(flags=re.I)。 - 收集所有匹配的元素后,转为
pd.Series即可得到期望的结果:0 English 1 english 2 Spanish and English 3 Portuguese, English dtype: object
内容的提问来源于stack exchange,提问作者matt.aurelio
相关产品推荐
相关产品推荐

