在多个pandas Series中查找子字符串遇维度错误,求expand用法
expand参数用法 嘿,我完全懂你遇到的这个头疼问题!「Data must be 1-dimensional」这个报错十有八九是因为你在用pandas处理批量字符串时,匹配方法返回了多维结果(比如DataFrame),而你需要的是一维的Series数据。你想到expand参数真的找对方向了,我来给你拆解清楚怎么用:
先明确场景
先假设你是在处理pandas Series(批量字符串),比如:
import pandas as pd # 模拟你的待搜索数据 search_series = pd.Series(["what is up", "findin what here", "no what here either", "no match"])
1. 用str.extract()时的expand参数
str.extract()是用来提取匹配的子串,默认expand=True会返回DataFrame(每个正则分组对应一列),这时候如果你想把结果赋值给一个一维的列,就会触发维度错误。
正确用法:
如果你只需要提取单个子串(比如你的目标"what"),给正则加一个捕获分组,然后设置expand=False,这样会直接返回一维的Series:
# 提取所有"what"子串,返回一维Series result = search_series.str.extract(r'(what)', expand=False) print(result)
输出是:
0 what 1 what 2 what 3 NaN dtype: object
完美符合一维数据的要求,不会再报错。
如果你的正则有多个分组,expand=False会返回一个MultiIndex的Series,而expand=True会返回多列的DataFrame,根据你的需求选择就行。
2. 用str.findall()处理多匹配场景
如果你需要找到每个字符串里所有的"what"出现(比如某个字符串里有多个"what"),str.findall()会返回包含列表的Series,这时候如果想把每个匹配项单独成行(转成一维),可以用explode()方法:
# 先找到所有匹配的列表,再展开成一维 result = search_series.str.findall(r'what').explode() print(result)
输出是:
0 what 1 what 2 what 3 NaN dtype: object
注意:findall()本身没有expand参数,它的维度问题靠explode()解决。
针对你的具体需求
你说待搜索值是"findin",目标是"what"——如果是单个字符串的话,其实直接用Python原生的"what" in "findin"就能判断是否存在,或者"findin".find("what")获取索引。但你遇到了维度错误,显然是在处理批量数据,用上面的pandas方法就能搞定。
试试看这些方法,应该就能解决你的维度问题啦!
内容的提问来源于stack exchange,提问作者MissBleu

