Python pandas实现DataFrame整数及字符串类型字段掩码脱敏问题
pandas DataFrame混合类型列脱敏解决方案
问题根因
现有代码对整数列失效是两个类型匹配问题导致的:
- 等值匹配逻辑中,整数列的存储类型为int,你传入的待匹配值
valuetomask是字符串,类型不一致会导致判断结果永远为False,mask逻辑不触发 .str是pandas字符串类型列的专属访问器,整数列调用该方法会直接返回空值,无法完成字符串切片操作
通用实现代码
核心逻辑是先将待脱敏列统一转为字符串类型,兼容整数、字符串两种输入格式,再实现两类脱敏能力:
import pandas as pd def mask_dataframe_column(df, column_name, mask_type="partial", match_value=None, keep_prefix=6, keep_suffix=0, mask_char="*"): """ 对DataFrame指定列做脱敏处理 参数说明: df: 待处理的DataFrame column_name: 要脱敏的列名 mask_type: 脱敏类型,可选值 "full"(全量脱敏) / "partial"(部分脱敏) match_value: 可选,仅当设置该值时,只对列中等于该值的内容做脱敏,否则整列统一脱敏 keep_prefix: 部分脱敏场景,保留开头的位数 keep_suffix: 部分脱敏场景,保留结尾的位数 mask_char: 掩码使用的字符 """ # 先统一转为字符串类型,兼容数值、字符串输入 col = df[column_name].astype(str).copy() if mask_type == "full": # 全量脱敏:统一替换为等长掩码 mask_len = col.str.len().fillna(0) masked_val = mask_len.apply(lambda x: mask_char * int(x)) elif mask_type == "partial": # 部分脱敏:保留指定前后位数,中间替换为掩码 def partial_mask(s): if len(s) <= keep_prefix + keep_suffix: return mask_char * len(s) prefix = s[:keep_prefix] if keep_prefix > 0 else "" suffix = s[-keep_suffix:] if keep_suffix > 0 else "" mask_part = mask_char * (len(s) - keep_prefix - keep_suffix) return prefix + mask_part + suffix masked_val = col.apply(partial_mask) else: raise ValueError("mask_type仅支持full/partial两种取值") # 配置了match_value则仅替换匹配到的值,否则整列替换 if match_value is not None: match_value = str(match_value) df[column_name] = col.mask(col == match_value, masked_val) else: df[column_name] = masked_val return df # 调用示例 if __name__ == "__main__": filename = "path/to/your/file.csv" target_column = "phonenumber" df = pd.read_csv(filename) # 场景1:整列全量脱敏,所有值都替换为等长* df = mask_dataframe_column(df, target_column, mask_type="full") # 场景2:整列部分脱敏,保留前3位后4位,中间替换为* # df = mask_dataframe_column(df, target_column, mask_type="partial", keep_prefix=3, keep_suffix=4) # 场景3:仅匹配值为9876543212的内容做部分脱敏,其他值保留原样 # df = mask_dataframe_column(df, target_column, mask_type="partial", match_value=9876543212, keep_prefix=6, keep_suffix=0) print(df) # 处理完成后可导出结果 # df.to_csv("masked_result.csv", index=False)
常见场景参数调整
- 掩码后3位:设置
keep_prefix = 总长度 -3,keep_suffix=0即可,比如11位手机号就设keep_prefix=8 - 掩码前3位:设置
keep_prefix=0,keep_suffix=总长度-3即可 - 仅脱敏指定值:传入
match_value参数即可,支持传入整数或字符串类型的待匹配值
内容的提问来源于stack exchange,提问作者bhavishya alla
相关产品推荐
相关产品推荐

