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

如何将DataFrame中字符串形式的列表转为Python列表?

嘿,这个问题我太熟了!你遇到的情况是DataFrame的query列里存的都是字符串格式的列表/元组,而不是真正的Python容器对象,所以调用len()的时候算的是字符串的长度(比如"[]"的长度就是2),而不是列表里元素的个数。下面给你几种靠谱的转换方法:

方法1:用ast.literal_eval(最推荐)

这是Python标准库ast里的安全解析函数,专门用来把字符串形式的Python对象转换成实际对象,比直接用eval安全得多(不会执行恶意代码)。

先看示例代码:

import ast
import pandas as pd

# 模拟你的DataFrame
df = pd.DataFrame({
    'query': ["[]", "[(apple,10),(orange,15)]", "[(apple,2),(orange,5)]"]
})

# 注意:如果你的字符串里的水果名没有引号(比如`apple`而不是`'apple'`),`ast.literal_eval`会报错,因为它会把apple当成变量名。这时候先给水果名加引号:
df['query'] = df['query'].str.replace(r'(\w+)(?=,)', r"'\1'", regex=True)
df['query'] = df['query'].str.replace(r'(?<=, )(\w+)', r"'\1'", regex=True)

# 执行转换
df['query'] = df['query'].apply(ast.literal_eval)

# 验证结果
print(df['query'].apply(len))
# 输出:0    0
#       1    2
#       2    2
#       Name: query, dtype: int64

这个方法几乎能处理所有标准的Python容器格式字符串,而且安全可靠,是首选方案。

方法2:用eval(不推荐,谨慎使用)

如果你的数据是绝对安全的(比如完全由你自己生成,没有外部输入),也可以直接用eval,但要注意:eval会执行字符串里的任何Python代码,要是字符串里有恶意代码,会直接运行,风险很高。

代码示例:

df['query'] = df['query'].apply(eval)

除非你能100%确保数据安全,否则别用这个方法。

方法3:手动解析字符串(适合特殊格式)

如果你的字符串格式比较奇怪(比如不符合标准Python容器语法),上面两种方法都失效的话,就只能手动解析了。比如针对你的数据格式,写个自定义解析函数:

def parse_query_string(s):
    # 处理空列表的情况
    if s.strip() == '[]':
        return []
    # 去掉首尾的方括号,分割成单个元组字符串
    tuple_strings = s.strip('[]').split('),(')
    result = []
    for t_str in tuple_strings:
        # 去掉元组的括号,分割成水果名和数字
        fruit, num = t_str.strip('()').split(',')
        # 清理空格并转换类型
        result.append((fruit.strip(), int(num.strip())))
    return result

df['query'] = df['query'].apply(parse_query_string)

这种方法虽然麻烦,但可以灵活处理各种非标准格式,适合定制化需求。

转换完成后,你再调用df['query'].apply(lambda x: len(x)),第一行就会返回0啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:34:16