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会变成这样:
| index | target_col |
|---|---|
| 0 | NaN |
| 1 | ['2019'] |
| 2 | NaN |
| 3 | NaN |
| 4 | NaN |
| 5 | '2021' |
可以看到:
- 所有包含'2018'的列表和单个'2018'值都被替换成了和原列一致的
NaN - 原NULL值保持不变
- 不包含'2018'的列表和非列表值也保留了原类型,没有出现类型混杂的问题
补充说明
如果你的原列NULL值是None而不是np.nan,只需要把函数里的return np.nan改成return None即可,这样整个列的空值类型保持统一,不会出现混杂。
内容的提问来源于stack exchange,提问作者Nick Knauer
相关产品推荐
相关产品推荐

