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
相关产品推荐
相关产品推荐

