TypeError: write() argument must be str, not Series 如何将dataframe.apply结果保存为json文件
问题解决:将Pandas处理得到的NER训练数据正确保存为JSON文件
报错原因
你遇到的报错有两个核心诱因:
df.apply()执行后返回的是PandasSeries对象,不是可直接写入文件的字符串类型,无法直接传给write()方法- 你的返回结果中包含大量Python元组结构,JSON格式原生不支持元组,序列化前需要统一转换为列表类型
修改后可运行代码
import pandas as pd import numpy as np import json df = pd.read_csv("file") def get_lengths(s): cols = s.index[::2] labels = s.index[1::2] l = list(np.cumsum(list(map(len, s[cols])))) l = list(zip([0]+l[:-1], l)) # 所有元组转列表,适配JSON格式要求 entities = [[list(item) for item in zip(l, labels)]] return [' '.join(s[cols]), {'entities': entities}] # 将Series转为普通Python列表 TRAIN_DATA = df.apply(get_lengths, axis=1).tolist() # 序列化写入JSON文件 with open('G:/Downloads/output5.json', 'w', encoding='utf-8') as f: json.dump(TRAIN_DATA, f, ensure_ascii=False, indent=2)
改动说明
- 补充了原代码缺失的
pandas导入声明 - 调整了
get_lengths函数的返回值,将所有Python元组转换为列表,符合JSON序列化规则 - 使用
tolist()方法将Pandas Series对象转换为普通Python列表 - 改用
json.dump()方法直接将Python对象序列化为JSON字符串写入文件,指定utf-8编码避免乱码,新增indent参数让输出的JSON格式更易读
如果后续读取该JSON文件后需要元组结构,手动遍历把对应位置的列表转回元组即可。
内容的提问来源于stack exchange,提问作者bellatrix
相关产品推荐
相关产品推荐

