如何在pandas DataFrame的文本列中提取giraffe+四位数字格式的子串
解决方案
核心问题原因
原有代码的错误点在于生成Giraffe_numbers列时,每次切片都调用了Giraffe_Index整列的最大值作为起止位置,没有逐行读取每行对应的索引值,导致所有行都用了同一个切片范围。
最优实现方案(推荐)
直接使用pandas内置的str.extract方法,通过正则匹配直接提取目标格式内容,无需手动计算索引,代码更简洁容错性更高:
import pandas as pd file_path = 'test.csv' data = pd.read_csv(file_path) # 正则匹配giraffe+4位数字的格式,括号内为需要提取的内容 data['Giraffe_numbers'] = data['text'].str.extract(r'(giraffe\d{4})') # 可选:保留Giraffe_Present标记列,匹配到内容为True,否则为False data['Giraffe_Present'] = data['Giraffe_numbers'].notna() # 导出结果到新csv文件 data.to_csv('new_test.csv', index=False) print(data)
兼容原有逻辑的修改方案
如果你需要沿用手动计算索引的实现思路,只需要调整最后生成Giraffe_numbers的逻辑,改为按行遍历读取当前行的索引值即可:
import pandas as pd file_path = 'test.csv' data = pd.read_csv(file_path) sub = "giraffe" data['Giraffe_Present'] = data['text'].str.contains(sub) data["Giraffe_Index"] = data['text'].str.find(sub) # axis=1表示按行遍历,直接取当前行的索引值计算切片范围 data['Giraffe_numbers'] = data.apply( lambda row: row['text'][row['Giraffe_Index']:row['Giraffe_Index']+11] if row['Giraffe_Present'] else None, axis=1 ) data.to_csv('new_test.csv', index=False) print(data)
内容的提问来源于stack exchange,提问作者sunrayk
相关产品推荐
相关产品推荐

