You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在高维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_colsLemon836Manf3953

  • 第1行这两列的值是4和1,Top1是4,所以Manf3953会被设为0;
  • 第2行是5和9,Top1是9,所以Lemon836会被设为0;
    而Basic开头的Basic1011Basic2837等,以及_T结尾的Car92_TBasic383_T列的数值始终保持原样。

内容的提问来源于stack exchange,提问作者asmgx

火山引擎 最新活动