如何在Python中清洗DataFrame的RTF值并合并关联行?
解决方案
1. RTF格式文本提取纯文本
别手动写正则硬怼RTF标记,这类需求用专门的RTF解析库更靠谱,能避免漏处理嵌套标记或特殊格式。推荐用striprtf库:
- 先安装依赖:
pip install striprtf
- 编写批量清洗函数:
from striprtf.striprtf import rtf_to_text import pandas as pd def clean_rtf(text): # 处理空值或非字符串类型 if pd.isna(text) or not isinstance(text, str): return "" # 转纯文本后,额外清理残留的格式标记(striprtf通常会自动处理,保险起见再加一层) plain_text = rtf_to_text(text) plain_text = plain_text.replace(r"\par", "").replace(r"\tab", "") # 去除多余换行和空格 return ' '.join(plain_text.split()) # 应用到DataFrame的Text列 df['Text'] = df['Text'].apply(clean_rtf)
2. 按TEXTID合并拆分文本行
用pandas原生的groupby+agg操作,比逐行循环拼接高效N倍,适合大数据量场景:
# 按TEXTID分组合并Text列(如果有行顺序要求,先按行号排序,比如假设有序列号列RowNum) # 若无行号,直接按原顺序合并 df_merged = df.groupby('TEXTID')['Text'].agg(' '.join).reset_index() # 如果需要保留其他列信息,比如取每组第一行的其他列值: df_merged = df.groupby('TEXTID').agg({ 'Text': ' '.join, '其他列1': 'first', '其他列2': 'first' }).reset_index()
完整流程示例
# 假设已从Oracle读取到DataFrame df import pandas as pd from striprtf.striprtf import rtf_to_text def clean_rtf(text): if pd.isna(text) or not isinstance(text, str): return "" plain_text = rtf_to_text(text) plain_text = plain_text.replace(r"\par", "").replace(r"\tab", "") return ' '.join(plain_text.split()) # 清洗RTF文本 df['Text'] = df['Text'].apply(clean_rtf) # 合并同一TEXTID的行 df_final = df.groupby('TEXTID')['Text'].agg(' '.join).reset_index() # 查看结果 print(df_final.head())
方案优势
- RTF解析:
striprtf是专门处理RTF的工具,比手动正则更健壮,能搞定复杂嵌套标记、特殊字符等场景; - 合并操作:pandas原生groupby是向量化操作,性能远高于循环拼接,轻松应对百万级数据量。
内容的提问来源于stack exchange,提问作者Mugiwara
相关产品推荐
相关产品推荐

