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

Pandas如何保留DataFrame每行的前N大数值并将其余值置为0

报错原因

你之前的写法报错是因为nlargest(3)返回的是仅包含前3大值的短Series,和原行的完整Series索引长度、标签都不匹配,直接比较就会触发标签不匹配的错误。


正确实现代码

你可以用where结合isin实现需求,完全符合你给出的预期输出:

import pandas as pd
# 原始DataFrame构造
df1 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[0, 1.2, 0.3, 2], 
    '02K W':[0.5, 2, 1.4, 3], 
    '03K W':[2, 1.6, 3, 5], 
    '04K W':[7, 0.5, 2.4, 5], 
    '05K W':[4, 2, 4.5, 1],
    '06K W':[2.7, 0, 0, 0],
    '07K W':[4, 3, 3, 2],
    '08K W':[3.8, 1, 9, 2],
    '09K W':[1, 4, 0.4, 6.3],
    '10K W':[0, 0, 9, 5.6]}) 
df1 = df1.set_index('Date')

# 核心逻辑:保留每行前3大值,其余置0
df_res = df1.apply(lambda row: row.where(row.isin(row.nlargest(3)), 0), axis=1)

如果需要严格限制每行仅保留3个值(出现并列第3的情况时也只取3个),可以用性能更高的rank方法实现:

df_res = df1.where(df1.rank(axis=1, ascending=False, method='first') <= 3, 0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:06:08