如何提取DataFrame中满足“大于0行数占比≥20%”的列
正确实现方法
先说说你原代码里的问题:
df3[df3 > 0]生成的是布尔值构成的DataFrame,但你后续用is去和数值比较完全不对,is是用来比较对象身份的,不是数值大小df3.iloc[1:, 1:]取的是从第二行第二列开始的子数据集,和你要计算全行列比例的需求不匹配- 循环遍历列的方式也绕远路了,pandas有内置方法可以直接批量计算
直接用pandas的向量操作就能高效解决:
步骤分解
- 计算每一列中数值大于0的行数占总行数的比例:
用(df3 > 0).mean(),布尔值在计算均值时会被转成1(True)和0(False),所以结果就是符合条件的行数占比。 - 筛选出占比≥20%(即0.2)的列名:
用布尔索引过滤上述结果,提取符合条件的列名。 - 从原DataFrame中提取这些列:
用筛选出的列名子集去索引原DataFrame。
完整代码
# 计算每列大于0的行数占比 positive_ratio = (df3 > 0).mean() # 筛选占比≥0.2的列 qualified_cols = positive_ratio[positive_ratio >= 0.2].index # 提取符合条件的列 filtered_df = df3[qualified_cols]
一行简化版
如果想更简洁,也可以把步骤合并成一行:
filtered_df = df3.loc[:, (df3 > 0).mean() >= 0.2]
这里loc[:, ...]的冒号表示保留所有行,后面的布尔数组用来筛选列。
内容的提问来源于stack exchange,提问作者Echo94
相关产品推荐
相关产品推荐

