基于给定列表筛选Pandas DataFrame列(列表元素可能不存在)
高效筛选Pandas DataFrame中存在的列(替代列表推导式的向量化方案)
完全理解你的痛点——当处理超大型DataFrame时,哪怕逻辑简单的Python列表推导式,也可能因为循环开销拖慢速度。这里有个底层优化的向量化方法,比列表推导式高效得多,而且代码更简洁:
核心方案:利用Pandas Index的intersection方法
Pandas的Index对象(也就是df.columns的类型)内置了intersection方法,这个方法是C语言实现的向量化操作,直接基于哈希表计算交集,完全避开了Python循环的开销。
基础用法(保持DataFrame列的原有顺序)
import pandas as pd # 你的示例DataFrame df = pd.DataFrame([[1,2,3,4,5],[6,7,8,9,10]], columns=list('ABCDE')) fil_lst = ['A', 'D', 'F'] # 高效筛选 new_df = df[df.columns.intersection(fil_lst)]
运行后得到的结果完全符合你的预期:
A D 0 1 4 1 6 9
进阶:保持筛选列表的原始顺序
如果希望结果列的顺序和你给出的fil_lst中存在的列顺序一致(而不是DataFrame本身的列顺序),可以反过来用筛选列表创建Index再求交集:
# 比如筛选列表顺序是['D', 'A', 'F'] fil_lst = ['D', 'A', 'F'] new_df = df[pd.Index(fil_lst).intersection(df.columns)]
此时结果列顺序是D在前,A在后,和筛选列表的顺序匹配:
D A 0 4 1 1 9 6
为什么这个方法比列表推导式快?
- 列表推导式本质是Python层面的循环,每一次
col in df.columns虽然是O(1)的哈希查找,但循环本身会带来额外开销; intersection是Pandas底层优化的C级向量化操作,直接对整个Index进行哈希交集计算,没有Python循环的额外消耗,在处理大型DataFrame或长筛选列表时,性能差距会非常明显。
内容的提问来源于stack exchange,提问作者Asif Iqbal
相关产品推荐
相关产品推荐

