为何筛选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
相关产品推荐
相关产品推荐

