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

为何筛选MAD值Top2000列后,DataFrame列数远超2000?

问题解析:筛选MAD最高的2000列却得到更多列的原因

问题重现

运行以下代码尝试筛选pandas DataFrame中MAD值最高的2000列:

print(split_df.shape)
mad_values = split_df.mad()
top_columns = mad_values.nlargest(2000).index
split_df = split_df[top_columns]
print(split_df.shape)

输出结果:

(580, 60660)
(580, 3556)

核心原因

问题出在nlargest(2000)的行为逻辑上:

  • pandas的nlargest(n)方法不会严格返回n个元素,而是返回所有值大于等于第n大元素值的元素。
  • 你的数据中,第2000大的MAD值存在大量重复列。比如,假设第2000个位置的MAD值对应了1556列,最终返回的列数就是2000 + 1556 = 3556,这就导致结果列数远超设定的2000。
  • 改成1999后仍不符合预期,也是因为第1999大的MAD值同样存在大量重复列。

验证方式

可以通过以下代码确认重复值的数量:

# 获取前2000大的MAD值
top_mad = mad_values.nlargest(2000)
# 查看最后一个值的重复次数
print(top_mad.value_counts().iloc[-1])
# 或者查看排序后第1999位的值对应的总列数
threshold = mad_values.sort_values(ascending=False).iloc[1999]
print((mad_values >= threshold).sum())

解决方法

如果需要严格获取前2000列(即使存在重复MAD值),可以先对MAD值排序,再直接截取前2000个索引:

sorted_mad = mad_values.sort_values(ascending=False)
top_columns = sorted_mad.iloc[:2000].index
split_df = split_df[top_columns]
print(split_df.shape)  # 此时会输出(580, 2000)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:22:08