You need to enable JavaScript to run this app. Pandas如何基于字典匹配保留指定列值、其余列置空
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何基于字典匹配保留指定列值、其余列置空

Pandas 按行匹配字典规则过滤列实现

注意:原始DataFrame中C5/C6是大写开头,你最初写的映射字典里是小写的c5/c6,实际运行时必须保证字典里的列名字符串和DataFrame的列名完全一致,否则会出现赋值错位或者匹配报错。

准备工作

先初始化对齐后的原始数据和映射规则:

import pandas as pd

df = pd.DataFrame(
    [["A","X",98,56,1,2,3,4],
     ["B","Z",79,54,36,3,4,8],
     ["C","Y",98,56,2,5,6,7],
     ["A","Y",79,54,36,12,13,24],
     ["B","X",98,56,3,6,7,8],
     ["C","Z",48,51,85,5,6,5]],
    columns=["id","key","c1","c2","c3","c4","C5","C6"]
)
# 修正映射字典的大小写,和实际列名完全对齐
mapping_dic = {"X":['c1','c3'],"Y":['c2','c4'],"Z":['C5','C6']}

小数据量方案:逐行处理

逻辑和你描述的规则完全一一对应,代码易读,适合万行以内的数据集:

def process_row(row):
    # 获取当前行需要保留的列名列表
    keep_targets = mapping_dic[row["key"]]
    # 遍历所有需要处理的数值列,不在保留范围的位置直接置为空字符串
    for col in [c for c in df.columns if c not in ("id", "key")]:
        if col not in keep_targets:
            row[col] = ""
    return row

df_out = df.apply(process_row, axis=1)

中大数据量方案:批量向量化处理

逐行apply在数据量过万时性能会明显下降,可以用分组掩码的方式批量赋值,运行速度能提升几个数量级,适合十万行以上的数据集:

# 拆分出不需要处理的标识列、需要过滤的数值列
id_cols = ["id", "key"]
value_cols = [c for c in df.columns if c not in id_cols]

# 初始化输出DataFrame,先把所有数值列默认置为空
df_out = df[id_cols].copy()
df_out[value_cols] = ""

# 按key的类别批量拷贝对应保留列的原始值
for key, keep_cols in mapping_dic.items():
    # 筛选出当前key对应的所有行
    row_mask = df["key"] == key
    # 批量把对应保留列的原始值拷贝到输出df
    df_out.loc[row_mask, keep_cols] = df.loc[row_mask, keep_cols]

结果校验

两种方法运行后得到的df_out和你给出的预期输出完全一致:

id key  c1 c2 c3 c4 C5 C6
0  A   X  98     1
1  B   Z                   4  8
2  C   Y     56     5
3  A   Y     54     12
4  B   X  98     3
5  C   Z                   6  5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 14:24:05