如何高效识别并移除Pandas DataFrame中的冗余列?
高效识别并移除Pandas中的冗余列
针对这类“多列取值完全一一对应”的冗余列问题,完全不需要用嵌套循环,利用Pandas的矢量化操作就能高效解决。核心思路是:将列的取值转换为统一的编码,编码完全相同的列就是冗余列——因为它们的取值映射关系完全一致。
具体实现步骤
1. 准备示例数据
import pandas as pd df = pd.DataFrame({'val':['a','b','c','d','e','f','g','h'], 'cat':['C','D','D','C','D','D','D','C'], 'num':[1,2,2,1,2,2,2,1], 'cat2':['X','Y','Y','X','Y','Y','Y','X']})
2. 生成列的统一编码
我们需要检查除val之外的所有列,用pd.factorize把每列的唯一值映射为连续整数——完全一一对应的列会生成完全相同的编码数组:
# 提取需要检查的列(排除val) cols_to_check = df.columns.drop('val') # 对每个列生成factorize编码 encoded = cols_to_check.to_series().apply(lambda col: pd.factorize(df[col])[0])
3. 识别并移除冗余列
有两种灵活的处理方式:
方式一:指定基准列(比如保留cat)
# 以cat列的编码为基准 base_code = encoded['cat'] # 找出所有和基准编码一致的冗余列 redundant_cols = encoded[encoded.eq(base_code)].index.drop('cat') # 删除冗余列 df_cleaned = df.drop(redundant_cols, axis=1)
方式二:自动分组保留每组一个列(适用于多组冗余场景)
如果数据中有多组独立的冗余列(比如除了cat/num/cat2,还有另一组A/1/X这样的对应列),可以自动分组,每组只保留第一个列:
# 按编码分组,每个组代表一组冗余列 code_groups = encoded.groupby(encoded.values.tolist()).groups # 每组保留一个列,加上val列 keep_cols = ['val'] + [next(iter(group)) for group in code_groups.values()] df_cleaned = df[keep_cols]
4. 最终结果
运行后得到的df_cleaned为:
val cat 0 a C 1 b D 2 c D 3 d C 4 e D 5 f D 6 g D 7 h C
为什么这个方法高效?
- 全程用Pandas的矢量化操作,避免了嵌套循环的O(n²)复杂度,即使列数很多(比如几十上百列)也能快速处理。
pd.factorize是底层优化过的函数,处理速度远快于手动遍历比较。
注意事项
如果列中存在缺失值,pd.factorize会将所有缺失值映射为-1,只要两个列的缺失值位置和非缺失值的映射完全一致,依然会被正确识别为冗余列,符合业务逻辑。
内容的提问来源于stack exchange,提问作者nuges01
相关产品推荐
相关产品推荐

