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

如何避免Pandas保存DataFrame到Excel时将文本列表转为字符串

我来帮你搞定这个问题!你碰到的是Excel和Pandas类型不兼容的典型情况——Excel本身没有原生的列表类型,所以Pandas会自动把列表转成字符串存进去,等你读回来的时候自然就没法直接当列表用了。下面给你三种可行的方案,你可以根据自己的需求选:

方案一:用Pandas结合序列化处理Excel读写

核心思路是把列表转成Excel能识别的结构化字符串(比如JSON格式),加载时再转回到列表。

首先先复现你遇到的问题:

import pandas as pd

# 原始数据:包含列表的DataFrame
df = pd.DataFrame({
    'words': [['apple', 'banana'], ['cat', 'dog', 'elephant']]
})

# 存到Excel
df.to_excel('words_list.xlsx', index=False)

# 重新加载
loaded_df = pd.read_excel('words_list.xlsx')
print(type(loaded_df['words'][0]))  # 输出:<class 'str'>,不是预期的列表!

接下来是修正后的代码,用json模块做序列化/反序列化:

import pandas as pd
import json

# 存储时:把列表转成JSON字符串
df['words'] = df['words'].apply(json.dumps)
df.to_excel('words_list_fixed.xlsx', index=False)

# 加载时:把JSON字符串转回列表
loaded_df = pd.read_excel('words_list_fixed.xlsx')
loaded_df['words'] = loaded_df['words'].apply(json.loads)

print(type(loaded_df['words'][0]))  # 输出:<class 'list'>,符合预期!
print(loaded_df['words'][0])        # 输出:['apple', 'banana']

小提示:如果你的列表里没有特殊转义字符,也可以用ast.literal_eval代替json.loads,但JSON格式的兼容性更强,更推荐。

方案二:用JSON直接读写(高效且原生支持列表)

JSON天生支持列表、字典等结构化数据,读写速度快,而且是纯文本格式,用普通编辑器就能查看,适合跨场景共享数据。

如果是纯字典格式的数据:

import json

# 原始数据
data = {
    'words': [['apple', 'banana'], ['cat', 'dog', 'elephant']]
}

# 写入JSON文件
with open('words_data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

# 加载JSON数据
with open('words_data.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)

print(type(loaded_data['words'][0]))  # <class 'list'>
print(loaded_data['words'][1])        # ['cat', 'dog', 'elephant']

如果要保留DataFrame格式,也可以用Pandas自带的JSON读写方法:

import pandas as pd

df = pd.DataFrame({'words': [['apple', 'banana'], ['cat', 'dog', 'elephant']]})

# 存为JSON
df.to_json('words_df.json', orient='records', force_ascii=False, indent=4)

# 加载回DataFrame
loaded_df = pd.read_json('words_df.json')
print(type(loaded_df['words'][0]))  # <class 'list'>
方案三:用Pickle序列化(Python专属,效率最高)

Pickle是Python原生的序列化工具,能直接保存几乎所有Python对象(包括DataFrame、列表),读写速度非常快,但它是二进制格式,只能用Python读取,不适合跨语言共享。

用原生Pickle模块:

import pandas as pd
import pickle

df = pd.DataFrame({'words': [['apple', 'banana'], ['cat', 'dog', 'elephant']]})

# 写入Pickle文件
with open('words_df.pkl', 'wb') as f:
    pickle.dump(df, f)

# 加载Pickle文件
with open('words_df.pkl', 'rb') as f:
    loaded_df = pickle.load(f)

print(type(loaded_df['words'][0]))  # <class 'list'>
print(loaded_df['words'][0])        # ['apple', 'banana']

Pandas也有更简便的封装方法:

df.to_pickle('words_df.pkl')
loaded_df = pd.read_pickle('words_df.pkl')

方案选择建议

  • 必须用Excel:选方案一,序列化后存储;
  • 需要跨语言或可读性:选方案二,JSON;
  • 追求速度和Python内便捷性:选方案三,Pickle。

内容的提问来源于stack exchange,提问作者DanielNg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:39:59