Python Pandas:拆分列中多来源引用为新行新列及格式不一致处理
处理Pandas中多引用单元格拆分与格式不一致问题
一、常规格式的引用拆分(对应你的示例1、目标效果2)
你之前用explode失败,是因为explode只对列表/数组类型的单元格生效,而原始数据是字符串格式,得先把字符串拆成单个引用的列表,再拆分行:
步骤代码:
import pandas as pd import re # 模拟你的原始数据(替换成你的真实DataFrame) df = pd.DataFrame({ 'row_id': [1, 2], 'source_citations': [ "Deep Learning (2016); Machine Learning Basics (2018)", "NLP in Practice (2020)" ] }) # 1. 将单个单元格的多引用拆分为列表(按分号+可选空格分割) df['citations'] = df['source_citations'].str.split(';\s*') # 2. 用explode拆分列表为独立行 df_split = df.explode('citations').drop(columns=['source_citations']) # 3. 从每个引用中提取title和year(匹配"标题 (年份)"格式) citation_pattern = r'(.*?)\s*\((\d{4})\)' df_split[['title', 'year']] = df_split['citations'].str.extract(citation_pattern) # 4. 清理标题的多余空格 df_split['title'] = df_split['title'].str.strip() # 最终结果 print(df_split)
输出效果就是每个引用对应一行,分别有独立的title和year列。
二、处理格式不一致的引用(对应你的示例3)
如果source_citations列存在分隔符不统一(比如用逗号、换行代替分号)、年份格式混乱(比如中文括号、无括号)等情况,需要用更鲁棒的正则和自定义函数处理:
适配多格式的代码:
# 处理不同分隔符(分号、逗号、换行都作为分隔符) df['citations'] = df['source_citations'].apply( lambda x: re.split(r'[;\n,]\s*', str(x)) if pd.notna(x) else [] ) # 自定义函数提取title和year,适配多种格式 def parse_citation(text): # 提取4位数字年份(不管有没有括号) year_match = re.search(r'\d{4}', text) year = year_match.group() if year_match else '未知年份' # 移除年份及周围的括号、空格,得到标题 title = re.sub(r'\s*\(?\d{4}\)?\s*$', '', text).strip() # 处理空标题的情况 title = title if title else '无标题' return pd.Series([title, year]) # 应用函数提取字段 df_split = df.explode('citations').drop(columns=['source_citations']) df_split[['title', 'year']] = df_split['citations'].apply(parse_citation) # 筛选异常行(可选,用于人工核对) # abnormal_rows = df_split[df_split['year'] == '未知年份'] # print(abnormal_rows)
关键适配点:
- 分隔符:用正则
[;\n,]\s*匹配分号、换行、逗号作为分隔符,同时忽略后面的空格 - 年份提取:直接抓取字符串中的4位数字,兼容有无括号、中英文括号的情况
- 异常处理:对提取失败的年份/标题标记为"未知年份"/"无标题",方便后续人工处理
内容的提问来源于stack exchange,提问作者jayh
相关产品推荐
相关产品推荐

