为何在DataFrame上调用json.dumps()会出现结果及导出文件差异?
问题分析:json.dumps()在DataFrame中的表现差异
核心原因:两次操作中列a的初始数据类型不同
第一组操作:
初始DataFrame的列a存储的是Python列表对象(dtype为object,实际内容是[])。执行json.dumps(x['a'])时,是将列表[]序列化为字符串"[]"。Pandas在显示DataFrame时,对于内容为"[]"的字符串,会省略外层引号(因其与列表[]的字符串表示完全一致),但实际数据类型已转为str。导出CSV时,字符串"[]"直接写入,无需额外转义,因此CSV内容为:,a 0,[] 1,[]第二组操作:
原DataFrame导出到CSV时,由于CSV无法存储Python列表,Pandas会将列表[]转为字符串"[]"写入文件;用read_csv读取后,列a的内容变为字符串"[]"(dtype为object)。此时执行json.dumps(x['a']),是对字符串"[]"做序列化,得到结果'"[]"'(为JSON格式的字符串,外层多一层双引号)。Pandas显示时会展示这层引号,导出CSV时,因字符串包含双引号,需按CSV规则用两个双引号转义,因此CSV内容为:,a 0,"""[]""" 1,"""[]"""
验证数据类型的方法
通过以下代码可确认数据类型差异:
# 第一组操作后 print(df.dtypes) # 输出:a object print(type(df['a'].iloc[0])) # 输出:<class 'str'> # 第二组操作读取CSV后(未执行json.dumps前) print(df.dtypes) # 输出:a object print(type(df['a'].iloc[0])) # 输出:<class 'str'> # 第二组操作执行json.dumps后 print(type(df['a'].iloc[0])) # 输出:<class 'str'>,内容为'"[]"'
总结
两次操作的本质区别是初始处理的数据类型不同:第一次是对列表进行JSON序列化,第二次是对字符串进行JSON序列化,最终生成的字符串内容存在差异,这直接导致了Pandas显示和CSV导出的结果不同。
内容的提问来源于stack exchange,提问作者Liii
相关产品推荐
相关产品推荐

