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
相关产品推荐
相关产品推荐

