如何从DataFrame的Desc列提取it_与$$$之间的子串?
解决DataFrame中提取指定子串的问题
原代码的问题
- 直接对
df['DESC']调用find()方法是错误的,Series的find()不会逐元素执行,返回的是标量值而非每个元素对应的索引,导致后续切片逻辑完全失效。 - 原代码里
idx1 + len(sub1) + 1多了一个+1,it_的长度是3,idx1 + len(sub1)已经指向目标子串的起始位置,不需要额外加1。
解决方案1:正则表达式(最简洁推荐)
用str.extract()配合正则表达式,直接匹配it_和$$$之间的内容:
import pandas as pd # 示例数据 data = {'DESC': [ '_000it_ZZZ$$$-', '_0780it_ZBZT$$$-', '_011it_BB$$$-', '_000it_CCCC$$$-' ]} df = pd.DataFrame(data) # 提取目标子串 df['results'] = df['DESC'].str.extract(r'it_(.*?)\$\$\$', expand=False)
正则说明:it_(.*?)\$\$\$中,it_匹配固定前缀,(.*?)是非贪婪匹配任意字符(避免匹配到多余内容),\$\$\$匹配后缀$$$($是正则特殊字符,需要转义)。
解决方案2:逐元素索引切片
如果不想用正则,修正原代码逻辑,用str.find()和str.slice()逐元素处理:
sub1 = "it_" sub2 = "$$$" # 计算每个元素的目标子串起始/结束索引 start_idx = df['DESC'].str.find(sub1) + len(sub1) end_idx = df['DESC'].str.find(sub2) # 切片提取 df['results'] = df['DESC'].str.slice(start=start_idx, stop=end_idx)
两种方法最终得到的results列结果都是:['ZZZ', 'ZBZT', 'BB', 'CCCC'],符合需求。
内容的提问来源于stack exchange,提问作者user18165921
相关产品推荐
相关产品推荐

