
使用 `str.extract()` 配合正则表达式可精准按第一个下划线将字符串列拆分为两个新列,避免 `str.split()` 产生的嵌套列表或多余分隔符问题。
在 Pandas 中,若需将类似 'Male_85__and_over' 的字符串仅按第一个下划线 _ 拆分为两段(即 gender = 'Male',age = '85__and_over'),直接使用 str.split('_', n=1) 易引入列表结构(如 ['Male', '85__and_over']),而 .str[1:] 会返回 list 类型,导致列值为 [85__and_over] —— 这显然不符合结构化分析需求。
更简洁、健壮的方案是使用 str.extract() 配合命名捕获组正则表达式:
test[["gender", "age"]] = test["column_Name_pivoted"].str.extract(r'^([^_]+)_((?:[^_]|_(?=[^_]))*)$')
但针对本例中“首下划线后剩余全部内容”的语义,推荐更清晰、通用的写法:
test[["gender", "age"]] = test["column_Name_pivoted"].str.extract(r'^([^_]+)_(.*)$')
✅ 解析说明:
- ^([^_]+):从开头匹配一个或多个非下划线字符(即首个字段,如 Male);
- _:字面量下划线(仅匹配第一个);
- (.*):贪婪匹配其后所有字符(包括后续的 _,如 85__and_over);
- ^ 和 $ 确保整行匹配,提升鲁棒性。
⚠️ 注意事项:
- 若原列存在不含 _ 的值(如 'Unknown'),extract() 将返回 NaN,可加 .fillna() 处理;
- str.split('_', n=1) 也可用 .str[0] 和 .str[1](非 .str[1:])提取,例如:
split_parts = test["column_Name_pivoted"].str.split('_', n=1, expand=True) test["gender"] = split_parts[0] test["age"] = split_parts[1].fillna("") # 处理无下划线情况此方式无需正则,更直观,且 expand=True 直接返回 DataFrame,推荐初学者优先尝试。
总之,str.extract() 适合需精确控制分隔逻辑的场景,而 str.split(..., expand=True) 更简洁通用——二者皆优于原始 .str[1:] 的错误用法。










