基于列名将指定文本列的非空值替换为NaN
解决方案:基于列名匹配特定文本,替换对应列非空值为NaN
核心思路
通过列名字符串匹配筛选目标列,再利用pandas的条件替换方法将列内非空值批量设为NaN。
示例代码
1. 构造示例数据(匹配参考图片结构)
import pandas as pd import numpy as np data = { 'Name': ['Alice', 'Bob', 'Charlie'], 'Maths_Marks': [85, 90, np.nan], 'Maths_Grade': ['A', 'A+', 'B'], 'Science_Marks': [78, np.nan, 82], 'Science_Grade': ['B', 'A', 'A'] } df = pd.DataFrame(data)
2. 批量替换逻辑
假设需要处理**列名包含"Maths"**的所有列:
# 筛选目标列:列名包含指定文本 target_columns = df.columns[df.columns.str.contains('Maths')] # 将目标列的非空值替换为NaN df[target_columns] = df[target_columns].mask(df[target_columns].notna())
代码解释
df.columns.str.contains('Maths'):生成布尔数组,标记列名是否包含指定文本,用于快速筛选目标列mask(df[target_columns].notna()):mask方法会将满足条件(非空)的元素直接替换为NaN,精准实现需求;也可以用where(df[target_columns].isna(), np.nan),效果完全一致
扩展用法
- 忽略大小写匹配:添加
case=False参数,兼容不同大小写的列名target_columns = df.columns[df.columns.str.contains('maths', case=False)] - 多文本匹配(支持正则):一次性匹配包含"Maths"或"Science"的列
target_columns = df.columns[df.columns.str.contains('Maths|Science')]
效果对比
处理前:
| Name | Maths_Marks | Maths_Grade | Science_Marks | Science_Grade |
|---|---|---|---|---|
| Alice | 85.0 | A | 78.0 | B |
| Bob | 90.0 | A+ | NaN | A |
| Charlie | NaN | B | 82.0 | A |
处理后:
| Name | Maths_Marks | Maths_Grade | Science_Marks | Science_Grade |
|---|---|---|---|---|
| Alice | NaN | NaN | 78.0 | B |
| Bob | NaN | NaN | NaN | A |
| Charlie | NaN | NaN | 82.0 | A |
内容的提问来源于stack exchange,提问作者Vignesh Vangala
相关产品推荐
相关产品推荐

