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

移除DataFrame列表列中的nan并统计列表元素数量

解决DataFrame中Risk Rating列的清洗与统计问题

问题分析

你的列里存在三种典型情况:pandas缺失值(NaN/pd.NA)、字符串形式的列表(比如"['High', 'nan', 'Low']")、空字符串。之前出现字符串拆成单个字符的问题,是因为直接对字符串调用list(),把字符串当成字符序列处理了——正确做法是先把字符串形式的列表解析成真正的Python列表。

完整解决方案

先导入依赖库:

import pandas as pd
import ast

1. 构造示例数据(模拟你的场景)

data = {
    "Risk Rating": [
        pd.NA,
        "['High', 'nan', 'Medium']",
        "",
        "['nan', 'Low']",
        "No Risk"  # 模拟可能存在的非列表格式普通字符串
    ]
}
df = pd.DataFrame(data)

2. 分步清洗与统计

  • 步骤1:统一处理缺失值与空字符串
    把pandas缺失值和空字符串都转为空列表,避免后续解析混乱:

    df['Risk Rating'] = df['Risk Rating'].apply(lambda x: [] if pd.isna(x) or x == "" else x)
    
  • 步骤2:解析字符串形式的列表
    对剩余的字符串类型元素,用ast.literal_eval解析成真实列表(彻底避免拆成字符)。如果遇到非列表格式的普通字符串,可根据需求转成单元素列表或空列表:

    def parse_to_list(s):
        if isinstance(s, str):
            try:
                return ast.literal_eval(s)
            except (SyntaxError, ValueError):
                # 非列表格式字符串,这里转成单元素列表,也可改为[]
                return [s]
        return s
    
    df['Risk Rating'] = df['Risk Rating'].apply(parse_to_list)
    
  • 步骤3:移除列表中的'nan'字符串元素
    过滤掉每个列表里值为'nan'的元素:

    df['Cleaned Risk Rating'] = df['Risk Rating'].apply(lambda lst: [item for item in lst if item != 'nan'])
    
  • 步骤4:统计列表元素数量
    新增列存储清洗后列表的长度:

    df['Risk Count'] = df['Cleaned Risk Rating'].apply(len)
    

3. 最终输出示例

处理后的DataFrame效果如下:

Risk RatingCleaned Risk RatingRisk Count
[][]0
['High', 'nan', 'Medium']['High', 'Medium']2
[][]0
['nan', 'Low']['Low']1
['No Risk']['No Risk']1

关键注意点

  • 绝对不能直接对字符串用list(),会把字符串拆成单个字符,必须用ast.literal_eval解析字符串格式的列表。
  • 要严格区分pandas缺失值(NaN)和字符串'nan':前者是整行的缺失值,需转成空列表;后者是列表内的元素,需过滤移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:37:24