如何用Python Pandas向CSV指定行写入NER训练数据?
解决方案
针对你生成NER训练CSV的需求,推荐两种可靠的实现方式,避免之前计数器结合df.loc[]导致的同步问题:
方法一:先构建完整数据结构再生成DataFrame
先按评论维度整理好所有行数据,给每个评论的首行分配Comment #,后续行留空,再统一转成DataFrame导出:
import pandas as pd # 示例:comments_data是已整理好的每条评论的行数据,子列表内是该行的其他字段(如文本、标签) comments_data = [ [["用户提到的实体1", "PER"], ["无关文本", "O"], ["地点信息", "LOC"]], [["另一评论文本", "O"], ["机构名称", "ORG"]] ] final_rows = [] # 遍历每条评论,生成带Comment #的行 for comment_idx, rows in enumerate(comments_data, start=1): # 处理评论首行:添加Comment编号 first_row = [f"Comment {comment_idx}"] + rows[0] final_rows.append(first_row) # 处理评论后续行:Comment #列留空 for row in rows[1:]: final_rows.append([""] + row) # 转成DataFrame并导出 df = pd.DataFrame(final_rows, columns=["Comment #", "Text", "Label"]) df.to_csv("ner_train_data.csv", index=False, encoding="utf-8")
方法二:逐行写入CSV(适合大数据场景)
如果数据量较大,不想先在内存中存储全量数据,可以用Python内置的csv模块逐行写入,精准控制每一行的Comment #值:
import csv comments_data = [ [["用户提到的实体1", "PER"], ["无关文本", "O"], ["地点信息", "LOC"]], [["另一评论文本", "O"], ["机构名称", "ORG"]] ] with open("ner_train_data.csv", "w", newline="", encoding="utf-8") as csv_file: writer = csv.writer(csv_file) # 写入表头 writer.writerow(["Comment #", "Text", "Label"]) for comment_idx, rows in enumerate(comments_data, start=1): # 写入评论首行 writer.writerow([f"Comment {comment_idx}"] + rows[0]) # 写入评论后续行(Comment #列空) for row in rows[1:]: writer.writerow([""] + row)
为什么之前的方法会同步失败?
df.loc[]依赖DataFrame的索引,如果你的操作中存在行删除、索引不连续的情况,定位"第一个空行"就会出错。上面两种方法都是从源数据结构出发,直接为每一行分配Comment #值,完全规避索引混乱的问题。
内容的提问来源于stack exchange,提问作者MrBigResearch
相关产品推荐
相关产品推荐

