如何使用pandas.read_excel()导入Excel含列表列并拆分?
问题根源 & 解决方案
你遇到的核心问题是:从Excel读取的"Fruit"列内容并不是真正的Python列表,而是伪装成列表格式的字符串。而你用字典创建DataFrame时,传入的是原生的Python列表对象,所以apply(pd.Series)能正常工作。
举个例子,Excel里单元格里的['Apple', 'Banana', 'Pear'],被pd.read_excel()读取后,实际类型是str,而不是list——你可以用df['Fruit'].apply(type)验证这一点,会看到输出都是<class 'str'>,而字典创建的DataFrame里这列的类型是<class 'list'>。
正确的处理步骤
你需要先把字符串格式的“伪列表”转换成真正的Python列表,再进行拆分操作,具体代码如下:
import pandas as pd import ast # 1. 读取Excel文件 df = pd.read_excel('fruit.xlsx') # 2. 将字符串格式的列表转换为真正的Python列表 # 处理空字符串的情况:如果单元格是空的,转成空列表 def str_to_list(s): if pd.isna(s) or s.strip() == '': return [] try: return ast.literal_eval(s) except: # 处理格式不规范的情况,返回空列表或原字符串 return [] df['Fruit'] = df['Fruit'].apply(str_to_list) # 3. 拆分列表为单独的列 fruits = df['Fruit'].apply(pd.Series) # 可以给拆分后的列命名,比如Fruit_1, Fruit_2... fruits.columns = [f'Fruit_{i+1}' for i in fruits.columns] # 合并原DataFrame和拆分后的列(可选) result = pd.concat([df, fruits], axis=1) print(result)
关键细节说明
ast.literal_eval()是安全的字符串转Python对象的方法,比eval()更安全,不会执行恶意代码。- 必须处理空字符串/缺失值的情况,否则
ast.literal_eval()会报错。 - 如果你的Excel里的列表格式不是标准的Python列表(比如用双引号或者其他分隔符),可能需要调整
str_to_list函数的逻辑,比如用字符串分割的方式处理。
内容的提问来源于stack exchange,提问作者jv22




