基于特定组合计算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为空
解决方案
实现思路
- 先把数据中的空字符串转为标准缺失值
pd.NA,方便后续空值判断 - 按
ID_Client、Name、Birth_date分组,筛选出符合所有条件的组 - 统计这些组的总记录数,除以原数据总记录数得到占比
代码实现
# 转换空字符串为标准缺失值 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
相关产品推荐
相关产品推荐

