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

DataFrame列值替换需求:将含'2018'值及非列表值替换为NULL

解决DataFrame列中含'2018'值的替换问题

首先,我先帮你构造一个完全符合你描述的可复现示例DataFrame:

import pandas as pd
import numpy as np

# 构造示例:列中包含列表、NULL(np.nan)、单个非列表值
df = pd.DataFrame({
    'target_col': [
        ['2017', '2018'],  # 列表包含'2018'
        ['2019'],          # 列表不包含'2018'
        np.nan,            # 原NULL值
        '2018',            # 非列表值需替换
        ['2020', '2018'],  # 列表包含'2018'
        '2021'             # 非列表值无需替换
    ]
})

针对你的需求——既要替换所有包含'2018'的元素(不管是列表内的元素还是单个值),又要避免替换后列数据类型混杂,最稳妥的方式是自定义一个处理函数,逐个元素判断并替换。这里的关键是用和原列一致的空值类型(比如原列用np.nan就返回np.nan,用None就返回None),避免引入不同类型的空值导致混杂。

步骤1:编写自定义处理函数

这个函数会处理三种情况:原空值、列表类型、非列表非空值:

def replace_2018_with_null(val):
    # 原NULL值直接返回,不做修改
    if pd.isna(val):
        return val
    # 如果是列表,检查是否包含'2018'
    elif isinstance(val, list):
        if '2018' in val:
            return np.nan  # 这里用和原列一致的空值类型,原列是np.nan就用它,原列是None就换None
        else:
            return val
    # 非列表非空值,检查是否等于'2018'
    else:
        if val == '2018':
            return np.nan
        else:
            return val

步骤2:应用函数到目标列

用apply方法把函数作用到整个列上:

df['target_col'] = df['target_col'].apply(replace_2018_with_null)

验证结果

处理后的DataFrame会变成这样:

indextarget_col
0NaN
1['2019']
2NaN
3NaN
4NaN
5'2021'

可以看到:

  • 所有包含'2018'的列表和单个'2018'值都被替换成了和原列一致的NaN
  • 原NULL值保持不变
  • 不包含'2018'的列表和非列表值也保留了原类型,没有出现类型混杂的问题

补充说明

如果你的原列NULL值是None而不是np.nan,只需要把函数里的return np.nan改成return None即可,这样整个列的空值类型保持统一,不会出现混杂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:14:00