You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效识别并移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:40:32