如何高效遍历大规模pandas数值DataFrame行返回满足阈值的列名字典
需求说明
对存储数值的pandas DataFrame,逐行识别单元格值满足阈值(本题设定阈值为0.05)的列名,最终输出以行索引为键、匹配列名组成的列表为值的字典。方案需适配10000行、700列的大规模数据规模,避免低效的逐单元格遍历。
最小可复现示例(MWE)
import pandas as pd import numpy as np np.random.seed(0) df = pd.DataFrame( np.random.randint(0,10,size=(8, 7))/100, columns=list('ABCDEFG'), index = ['Dog', "Cat", 'Pig', 'Horse', 'Fish', 'Chicken', 'Squid', 'Cheetah'] )
示例运行生成的DataFrame
A B C D E F G ---- ---- ---- ---- ---- ---- ---- 0.05 0 0.03 0.03 0.07 0.09 0.03 0.05 0.02 0.04 0.07 0.06 0.08 0.08 0.01 0.06 0.07 0.07 0.08 0.01 0.05 0.09 0.08 0.09 0.04 0.03 0 0.03 0.05 0 0.02 0.03 0.08 0.01 0.03 0.03 0.03 0.07 0 0.01 0.09 0.09 0 0.04 0.07 0.03 0.02 0.07 0.02 0 0 0.04 0.05 0.05 0.06 0.08
期望输出格式
{ 'Dog': ['A', 'E', 'F'], "Cat": ['A', 'D', 'E', 'F', 'G'], 'Pig': ['B', 'C', 'D', 'E', 'G'], 'Horse': ['A', "B", 'C'], 'Fish': ['A', 'E'], 'Chicken': ['C', 'F', 'G'], 'Squid': ['C', 'F'], 'Cheetah': ['D', 'E', 'F', 'G'] }
实现代码
针对大规模数据的性能需求,采用向量化布尔掩码的方式减少循环开销:
- 第一步:生成与原DataFrame同形状的布尔筛选表,值满足
>=0.05的位置保留原值,不满足的位置替换为缺失值 - 第二步:逐行提取非缺失值对应的列名,组装为列表
- 第三步:将最终序列转换为字典格式
threshold = 0.05 result = df[df >= threshold].apply( lambda row: row.dropna().index.tolist(), axis=1 ).to_dict()
补充说明:该实现逻辑的列名顺序与原DataFrame的列顺序保持一致,输出结果和示例期望格式完全匹配;在万行级规模下的运行效率远高于逐行逐单元格遍历的写法。
内容的提问来源于stack exchange,提问作者Tyler Rinker
相关产品推荐
相关产品推荐

