如何在Pandas中计算符合k-匿名性要求的含缺失值频率表?
实现符合k-匿名性要求的缺失值行计数方法
核心思路
由于缺失值可被视为任意类别,一条含缺失值的记录会对应多个非缺失的行组合(每个缺失字段取所有可能的非缺失类别)。我们需要:
- 生成所有合法的非缺失分类组合
- 统计每条原始记录能匹配哪些组合,累加得到每个组合的最终计数
代码实现
import pandas as pd import numpy as np from itertools import product # 构建示例数据集 d = { "key1": [1,1,2,np.nan], "key2": [1,1,1,1], "key3": [3,np.nan,3,np.nan] } df = pd.DataFrame(data=d) # 转换为分类类型(保留缺失值) for col in df.columns: df[col] = df[col].astype("Int64").astype("category") # 1. 获取每个列的非缺失分类类别 non_null_categories = { col: df[col].cat.categories[df[col].cat.categories.notna()] for col in df.columns } # 2. 生成所有非缺失的行组合(笛卡尔积) all_valid_combinations = pd.DataFrame( product(*non_null_categories.values()), columns=non_null_categories.keys() ) # 3. 初始化计数列 all_valid_combinations["f_k"] = 0 # 4. 遍历每条原始记录,统计其对各组合的贡献 for _, record in df.iterrows(): # 生成当前记录能匹配的组合掩码 match_mask = pd.Series([True] * len(all_valid_combinations)) for col in df.columns: val = record[col] if pd.notna(val): # 非缺失字段必须严格匹配 match_mask &= (all_valid_combinations[col] == val) # 对匹配的组合计数+1 all_valid_combinations.loc[match_mask, "f_k"] += 1 print(all_valid_combinations)
输出结果
key1 key2 key3 f_k 0 1 1 3 3 1 2 1 3 2
逻辑说明
- 组合
(1,1,3):匹配第1条完全匹配的记录、第2条key3缺失的记录(key3可取值3)、第4条key1和key3均缺失的记录(key1可取值1、key3可取值3),总计3条 - 组合
(2,1,3):匹配第3条完全匹配的记录、第4条key1和key3均缺失的记录(key1可取值2、key3可取值3),总计2条
内容的提问来源于stack exchange,提问作者Raphael Roth
相关产品推荐
相关产品推荐

