生成Pandas DataFrame所有列组合的行非空值占比字典
解决方法
代码实现
import pandas as pd from itertools import combinations # 初始化目标DataFrame d = {"A" : [3,4,7,6,5,8,None,4,7], "B" : ['a',None,'d',None,'j','u','k','k','z'], "C" : [4,None,8,4,8,None,2,7,None], "D" : [None,9,5,None,2,5,3,None,7], "E": ['m','n','l',None,'s','g','s','u','a']} df = pd.DataFrame(d) total_rows = len(df) result = {} # 生成所有非空列组合(覆盖1列到全列的所有情况) for i in range(1, len(df.columns)+1): for cols in combinations(df.columns, i): # 计算该列组合下所有列均非空的有效行数 valid_row_count = df[list(cols)].dropna().shape[0] ratio = valid_row_count / total_rows # 将组合归类到对应占比的列表中 if ratio not in result: result[ratio] = [] result[ratio].append(list(cols)) # 可按需打印或使用结果 for ratio, combos in result.items(): print(f"{ratio}: {combos}")
代码说明
- 列组合生成:借助
itertools.combinations生成所有非空列子集,确保覆盖从单列到全列的所有可能组合。 - 有效行数计算:对每个列组合,用
dropna()过滤掉存在空值的行,剩余行数即为该组合下的有效行数。 - 结果字典构建:以非空行占比为键,对应所有具有该占比的列组合列表为值——解决原示例中重复键的问题,避免字典键被覆盖丢失信息。
- 效率优化:提前计算总行数,避免重复计算冗余操作。
注意事项
原示例中的字典结构存在Python语法问题(字典不允许重复键),因此实际实现调整为键为占比,值为对应列组合的列表,确保完整保留所有组合的占比信息。
内容的提问来源于stack exchange,提问作者chaed
相关产品推荐
相关产品推荐

