You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:33:22