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

基于特定组合计算DataFrame重复项占比的进阶需求

特定条件下的重复项占比统计实现

原始DataFrame

import pandas as pd

df = pd.DataFrame(data = {
    'ID_Client': [12,13,11,14,32,48,21,8],
    'Name': ['Bryan','John','Sonya','Mark','Mark','Bryan','John','Emma'],
    'Birth_date': ['10-06-2001','12-08-1991','14-06-1976','15-06-1962','15-06-1962','10-06-2001','12-08-1991','14-06-1976'],
    'Email':['bryan@gmail.com','john@hotmail.com','','','','not-bryan@gmail.com','john@hotmail.com','emma@gmail.com'],
    'SMS':['','0718181818','0611111111','0688888888','0688888888','','0718181818','']
})

原有全列组合重复项统计代码

from itertools import combinations

tab = []

for a,b,c,d,e in combinations(range(0, len(df.columns)), 5):
    for i in range(1, len(df.columns)+1):
        tab.append([t for t in combinations(df.columns, i)])

tab2 = [[] for i in range(len(df.columns)**len(df.columns))]
number = 0

for i in range(len(tab)):
    for j in range(len(tab[i])):
        data_f = df.dropna(subset=tab[i][j]).loc[df.duplicated(subset=tab[i][j],keep=False)]
        tab2[number][i:0] = [tab[i][j]]
        tab2[number][len(df.columns):0] = [len(data_f)/len(df)]
        number += 1
        print(tab[i][j])
print(tab2)

tab2 = pd.DataFrame(tab2)
tab2.iloc[:, 1]
tab2[2] = tab2[0]
tab2 = tab2.iloc[: , 1:]
tab2

进阶需求

需要统计满足以下全部条件的重复项占比:

  • ID_Client、Name、Birth_date三者完全相同
  • 同一组内的Email均非空且存在不同值
  • 同一组内至少有一条记录的SMS为空

解决方案

实现思路

  1. 先把数据中的空字符串转为标准缺失值pd.NA,方便后续空值判断
  2. 按ID_Client、Name、Birth_date分组,筛选出符合所有条件的组
  3. 统计这些组的总记录数,除以原数据总记录数得到占比

代码实现

# 转换空字符串为标准缺失值
df_clean = df.replace('', pd.NA)

# 筛选符合条件的分组记录
qualified_records = df_clean.groupby(['ID_Client', 'Name', 'Birth_date']).filter(
    lambda group: 
    # 组内所有Email非空且存在不同值
    (group['Email'].notna().all() and group['Email'].nunique() > 1) 
    # 组内至少有一条SMS为空
    and (group['SMS'].isna().any())
)

# 计算占比
ratio = len(qualified_records) / len(df)

print(f"符合条件的重复项占比: {ratio:.2%}")

代码解释

  • df.replace('', pd.NA):把原数据中的空字符串转为pd.NA,统一空值判断逻辑
  • groupby().filter():保留所有满足lambda条件的组的全部记录,lambda内的条件完全匹配需求中的三个要求
  • 最后用符合条件的记录数除以总记录数,得到占比并格式化输出

内容的提问来源于stack exchange,提问作者Mop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:06:23