Pandas中基于两列后缀内容生成第三列的实现问题
解决Pandas中生成去前缀拼接新列的问题
嘿,我来帮你搞定这个问题!首先明确你的需求:你有一个两列的DataFrame,要生成第三列,把前两列去掉下划线开头的前缀后,将剩余部分拼接起来,还要处理那些本身没有前缀或者是空单元格的情况。
先看你给出的示例:
| col1 | col2 | col3(需生成) |
|---|---|---|
| abc_what_I_want1 | abc_what_I_want1 | what_I_want1what_I_want1 |
| psdb_what_I_want2 | what_I_want2 | what_I_want2what_I_want2 |
| vxc_what_I_want3 | vxc_what_I_want3 | what_I_want3what_I_want3 |
| qk_what_I_want4 | qk_what_I_want4 | what_I_want4what_I_want4 |
| ertsa_what_I_want5 | what_I_want5 | what_I_want5what_I_want5 |
| abc_what_I_want6 | abc_what_I_want6 | what_I_want6what_I_want6 |
你之前尝试的代码之所以报错,核心原因是搞错了Pandas字符串方法的返回类型:df["col1"].str.split("_", 1)返回的是一个Series,每个元素是分割后的列表;你直接用[1]或者[-1]是在对整个Series取索引,而不是对每个元素的列表取索引,这肯定会报错呀!
给你几个靠谱的解决方案:
方法1:用str.split结合str[]提取目标部分
这是最直观的方式,先拆分,再取每个列表的第二个元素,同时处理没有下划线的情况:
# 处理col1:拆分后取下划线后的部分,没有下划线就保留原内容 col1_clean = df["col1"].str.split("_", 1).str[1].fillna(df["col1"]) # 处理col2:逻辑和col1一致 col2_clean = df["col2"].str.split("_", 1).str[1].fillna(df["col2"]) # 拼接生成col3 df["col3"] = col1_clean + col2_clean
解释一下:
str.split("_", 1).str[1]:对Series里的每个字符串做拆分(只拆一次),然后取拆分后列表的第二个元素(索引1)fillna(df["col1"]):如果某个单元格没有下划线,拆分后会得到NaN,这时候就用原单元格的内容填充,比如示例中col2的那些行
方法2:用正则表达式直接提取
如果你的前缀都是非下划线字符,用正则提取会更简洁:
# 提取col1中下划线后的所有内容,没有下划线就取原内容 col1_clean = df["col1"].str.extract(r"_(.*)", expand=False).fillna(df["col1"]) col2_clean = df["col2"].str.extract(r"_(.*)", expand=False).fillna(df["col2"]) df["col3"] = col1_clean + col2_clean
正则r"_(.*)"的意思是:匹配一个下划线,然后捕获后面的所有字符;如果没有下划线,extract会返回NaN,我们用fillna补全即可。
方法3:逐行处理的简化版
如果你喜欢一行代码搞定,可以用apply逐行判断:
df["col3"] = df.apply( lambda row: (row["col1"].split("_", 1)[1] if "_" in row["col1"] else row["col1"]) + (row["col2"].split("_", 1)[1] if "_" in row["col2"] else row["col2"]), axis=1 )
这个方法会遍历每一行,检查每个单元格是否包含下划线,再决定取拆分后的部分还是原内容,最后拼接。
测试验证
用你给出的示例数据跑这些代码,都能生成符合要求的col3列,包括空单元格的情况(如果单元格是空字符串,拼接后还是空字符串)。
内容的提问来源于stack exchange,提问作者noah
相关产品推荐
相关产品推荐

