移除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 Rating | Cleaned Risk Rating | Risk 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
相关产品推荐
相关产品推荐

