如何在Pandas中按条件拆分DataFrame列并生成新列?
解决方法
你需要同时提取C列中q前后的内容,单独用replace只能修改原列,无法生成新列。这里提供两种高效的实现方式:
方法一:使用str.extract正则提取
通过正则表达式一次性捕获两个分组,分别对应q之前的内容和q及之后的部分,再处理空值:
import pandas as pd # 处理DataFrame dfin[['C', 'D']] = dfin['C'].str.extract(r'^(.*?)(q.*)?$', expand=True) # 将D列的空值替换为空白字符串 dfin['D'] = dfin['D'].fillna('')
正则说明:
^(.*?):非贪婪匹配从开头到q之前的所有内容(确保只匹配到第一个q)(q.*)?:可选分组,匹配以q开头的所有后续内容;没有q的行该分组为NaN,后续用fillna转为空白
方法二:使用str.split拆分字符串
按q拆分C列,再重新赋值列并拼接D列内容:
import pandas as pd # 按q拆分,最多拆分为2部分 split_data = dfin['C'].str.split('q', n=1, expand=True) # 更新C列为拆分后的第一部分 dfin['C'] = split_data[0] # 生成D列:有拆分结果则拼接q和后续内容,否则留空 dfin['D'] = split_data[1].apply(lambda x: f'q{x}' if pd.notna(x) else '')
代码说明:
str.split('q', n=1):只拆分一次,避免C列有多个q时过度拆分- 因为拆分后会丢失分隔符
q,所以需要在D列手动补回q
处理后你的DataFrame会变成:
| A | B | C | D |
|---|---|---|---|
| a | 1 | 198 | q24 |
| a | 2 | 128 | q6 |
| a | 6 | 1456 | |
| b | 7 | 67 | q22 |
| b | 1 | 56 | |
| c | 3 | 451 | q2 |
| d | 11 | 1 | q789 |
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

