如何在Python/Pandas中提取CSV单元格文本块中含指定关键词的内容?
解决方法
假设你的目标关键词是Supplier assignment notification(可根据实际需求替换),可以通过以下步骤提取对应时间:
步骤1:拆分文本块为独立子段
每个单元格的文本以--------作为分隔符,先拆分出所有子记录,同时清理空内容和多余换行:
步骤2:匹配关键词并提取对应时间
遍历每个子段,检查内容是否包含目标关键词,若匹配则提取子段第一行的时间字符串,还可转换为Pandas的datetime格式方便后续分析。
完整代码示例
import pandas as pd import re # 读取CSV文件 df = pd.read_csv('your_file.csv') # 替换为你实际需要的目标关键词 TARGET_KEYWORD = "Supplier assignment notification" def extract_supplier_response_time(text): # 拆分文本块并清理无效内容 segments = [seg.strip() for seg in text.split('--------') if seg.strip()] matched_times = [] for seg in segments: # 拆分子段的行,过滤空行 lines = [line.strip() for line in seg.split('\n') if line.strip()] if not lines: continue # 检查子段是否包含目标关键词 if TARGET_KEYWORD in '\n'.join(lines): # 提取时间部分(去掉末尾的人名后缀,比如"- Jim") time_match = re.match(r'^(.*?)\s-\s\w+$', lines[0]) if time_match: time_str = time_match.group(1) # 转换为datetime格式,异常时保留原字符串 try: time_dt = pd.to_datetime(time_str, format='%B %d, %Y %I:%M:%S %p %z') matched_times.append(time_dt) except ValueError: matched_times.append(time_str) # 返回第一个匹配的时间,需多匹配结果可返回列表 return matched_times[0] if matched_times else None # 生成新列存储提取的时间 df['Supplier_Response_Time'] = df['time Line'].apply(extract_supplier_response_time) # 查看结果 print(df[['time Line', 'Supplier_Response_Time']])
代码说明
split('--------'):快速拆分出每个独立的操作记录段。- 正则
^(.*?)\s-\s\w+$用于剥离时间行末尾的人名后缀,若不需要清理直接取lines[0]即可。 pd.to_datetime将字符串时间转为可操作的datetime对象,支持后续排序、筛选等分析操作。- 若单个单元格存在多个匹配子段,可修改返回逻辑为返回所有匹配时间的列表。
灵活调整
只需修改TARGET_KEYWORD的值即可适配不同的关键词;若时间格式有变化,可调整pd.to_datetime的format参数,或去掉format让Pandas自动推断格式。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

