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

含列表与NaN的DataFrame列空值替换问题及报错解决咨询

解决DataFrame列中空列表、NaN替换为{}的问题

问题场景

DataFrame的某列包含嵌套列表、空列表与NaN值,需要将所有空列表和NaN替换为{}。模拟数据示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({'c': [[['l1'], ['l2']], [], np.nan]})

尝试的错误代码及原因

第一次尝试

代码:

df['c'].apply(lambda x: {} if pd.isna(x) or len(x)==0 else x[0])

报错:

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

原因:当x是[[l1], [l2]]这类嵌套列表时,pd.isna(x)会返回一个布尔数组(而非单个布尔值),直接用or进行条件判断会触发歧义错误。

第二次尝试

代码:

df['c'].apply(lambda x: {} if pd.isna(x).all() or len(x)==0 else x[0])

报错:

'bool' object has no attribute 'all'

原因:当x是NaN时,pd.isna(x)返回单个布尔值True,布尔对象没有.all()方法,因此报错。

正确实现方案

核心思路:先判断x是否为标量NaN(避免对列表使用pd.isna()返回数组),再判断是否为空列表,最后返回嵌套列表的第一个元素。

简洁lambda写法

df['c'] = df['c'].apply(
    lambda x: {} if pd.api.types.is_scalar(x) and pd.isna(x) or len(x) == 0 else x[0]
)

可读性更高的函数写法

def process_column_value(x):
    # 判断是否为标量NaN
    if pd.api.types.is_scalar(x) and pd.isna(x):
        return {}
    # 判断是否为空列表
    if len(x) == 0:
        return {}
    # 返回嵌套列表的第一个元素
    return x[0]

df['c'] = df['c'].apply(process_column_value)

执行后,df['c']的结果为[[l1], {}, {}],符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:05:14