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

如何在Pandas中计算符合k-匿名性要求的含缺失值频率表?

实现符合k-匿名性要求的缺失值行计数方法

核心思路

由于缺失值可被视为任意类别,一条含缺失值的记录会对应多个非缺失的行组合(每个缺失字段取所有可能的非缺失类别)。我们需要:

  1. 生成所有合法的非缺失分类组合
  2. 统计每条原始记录能匹配哪些组合,累加得到每个组合的最终计数

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:27:44