如何让Pandas保存的含字典列CSV读取时保持字典类型?
问题核心
CSV是纯文本格式,本身不支持存储字典、列表这类嵌套复杂数据类型。Pandas将DataFrame存入CSV时,会自动把字典转成字符串形式(比如{'text': 'xxx', 'answer_start': [123]}变为字符串),读取时自然识别为str类型,这是CSV的固有特性,无法让CSV文件本身“识别”字典列,只能从存储或读取环节优化处理。
解决方案
1. 改用支持复杂数据类型的存储格式(推荐)
如果无需强制使用CSV,优先选择Parquet、Feather这类专为表格数据设计的二进制格式,它们能直接保留Pandas的复杂数据类型,读写效率也更高:
# 存储为Parquet格式 splittrain.to_parquet("SQuAD_train.parquet", index=False) # 读取时直接保留字典类型 finaldf = pd.read_parquet("SQuAD_train.parquet") print(type(finaldf['answers'][0])) # 输出 <class 'dict'>
注意:使用Parquet需提前安装依赖pip install pyarrow或pip install fastparquet。
2. 优化CSV读取的转换逻辑(必须用CSV时)
如果一定要用CSV,除了ast.literal_eval,可以用更严谨的JSON解析逻辑,同时处理可能的格式异常:
import json def parse_answer_dict(s): try: # 替换单引号为双引号,适配JSON格式要求 return json.loads(s.replace("'", "\"")) except (json.JSONDecodeError, TypeError): # 转换失败时返回空字典或默认值 return {} # 读取时指定转换器 finaldf = pd.read_csv("SQuAD_train.csv", converters={'answers': parse_answer_dict})
这种方式比ast.literal_eval更安全,能避免执行恶意字符串。
3. 存储前拆分字典列(无需保留字典结构时)
如果后续不需要使用字典结构,可以把字典的键拆成独立列,这样CSV就能直接存储为普通字段:
# 拆分字典列到新的平级列 splittrain = splittrain.join(pd.json_normalize(splittrain['answers'])) # 删除原字典列 splittrain = splittrain.drop('answers', axis=1) # 存储CSV splittrain.to_csv("SQuAD_train.csv", index=False) # 读取时直接访问拆分后的列 finaldf = pd.read_csv("SQuAD_train.csv") print(finaldf['text'][0]) # 直接获取原字典中的text值
内容的提问来源于stack exchange,提问作者Ind
相关产品推荐
相关产品推荐

