You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python pandas实现DataFrame整数及字符串类型字段掩码脱敏问题

pandas DataFrame混合类型列脱敏解决方案

问题根因

现有代码对整数列失效是两个类型匹配问题导致的:

  1. 等值匹配逻辑中,整数列的存储类型为int,你传入的待匹配值valuetomask是字符串,类型不一致会导致判断结果永远为False,mask逻辑不触发
  2. .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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:12:01