You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动