如何扁平化Pandas的Series嵌套Series结构?
解决嵌套Series扁平化问题
你遇到的核心问题是:对Series调用str.extract后返回的是单列DataFrame,直接取行得到的是Series对象,而非单个字符串值。以下是两种无需遍历的扁平化方法:
方法1:直接提取后压缩为一维Series
利用squeeze()方法将单列DataFrame转换为一维Series,每个元素即为提取到的字符串:
import pandas as pd df = pd.DataFrame({"a": ["asf cat llma 3X dog elepnt", "cat dog child monkey 5X sljka", "fsdjkl; dsfaa"]}) # 提取并扁平化 sr_flat = df[df.a.str.contains("[3-6]X", na=False)].a.str.extract("([3-6]X)", expand=True).squeeze() # 验证类型 [type(sr_flat.iloc[i]) for i in range(sr_flat.shape[0])] # 输出:[<class 'str'>, <class 'str'>]
方法2:先提取再筛选(更清晰的流程)
先对整列完成提取操作,再筛选非空结果,最后压缩为一维Series:
import pandas as pd df = pd.DataFrame({"a": ["asf cat llma 3X dog elepnt", "cat dog child monkey 5X sljka", "fsdjkl; dsfaa"]}) # 第一步:提取所有行的匹配结果 extracted_df = df['a'].str.extract("([3-6]X)") # 第二步:筛选出有有效结果的行并压缩 sr_flat = extracted_df.dropna().squeeze()
为什么原来的代码会得到嵌套Series?
你调用sr.iloc[i]时,取的是DataFrame的行,而DataFrame的行本身就是Series类型。通过squeeze()或直接取列(extracted_df.iloc[:, 0]),可以将单列DataFrame转换为每个元素都是字符串的一维Series,从而实现扁平化。
内容的提问来源于stack exchange,提问作者johnrobot
相关产品推荐
相关产品推荐

