如何避免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
相关产品推荐
相关产品推荐

