如何在高维DataFrame中保留指定类别列并筛选其他类别的Top N最大值列
解决方案:针对指定列执行Top N筛选
我来帮你调整代码,刚好能满足你的需求——保留Basic开头和_T结尾的所有列数据,只对其余列做每行Top N的筛选(非Top值设为0)。具体步骤和代码如下:
步骤1:定义参数并筛选列类别
首先明确Top值,然后把DataFrame的列精准分成三类:
import pandas as pd # 设定Top N值,可根据需求修改为3、5、10等 Top = 20 # 筛选三类列 basic_cols = [col for col in df.columns if col.startswith("Basic")] t_cols = [col for col in df.columns if col.endswith("_T")] other_cols = [col for col in df.columns if not col.startswith("Basic") and not col.endswith("_T")]
步骤2:仅对目标列执行Top N筛选
我们直接在原DataFrame的副本上修改,只处理other_cols部分,其余列完全保留原始数据:
# 复制原DataFrame,避免修改原始数据 df_final = df.copy() # 对非Basic、非_T的列,每行保留Top N大的数值,其余设为0 df_final[other_cols] = df_final[other_cols].apply( lambda x: x.where(x.isin(x.nlargest(Top)), 0), axis=1 )
代码细节说明
- 列筛选逻辑:用
startswith()和endswith()精准匹配你定义的两类保留列,剩下的就是需要做Top N处理的目标列。 - Top N处理:
x.nlargest(Top)取出当前行前Top N大的数值,x.isin(...)判断每个元素是否属于这个Top集合,where()方法保留符合条件的数值,不符合的自动设为0。 - 数据保留:Basic开头和_T结尾的列全程不受影响,完全保留原始数值。
针对你提供的样本数据测试示例
假设Top=1,样本中的other_cols是Lemon836、Manf3953:
- 第1行这两列的值是4和1,Top1是4,所以
Manf3953会被设为0; - 第2行是5和9,Top1是9,所以
Lemon836会被设为0;
而Basic开头的Basic1011、Basic2837等,以及_T结尾的Car92_T、Basic383_T列的数值始终保持原样。
内容的提问来源于stack exchange,提问作者asmgx




