如何基于首次下划线分割 Pandas 列为两部分

12次阅读

如何基于首次下划线分割 Pandas 列为两部分

使用 `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:] 的错误用法。

text=ZqhQzanResources