仅保留数据框中每行的前 N ​​个值,并将其他设置为零

Only keep the top N values of each row in dataframe and set other to zero

我试图为每个 date/row 保留前 3 个值,并将所有其他值设置为零。

我创建了一个示例数据框:

import pandas as pd
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')

我努力调整 apply 函数以获得前 n 个值而不是最大值。我用 nlargest 尝试过,但随后出现错误:Can only compare identically-labeled Series objects.

df1.apply(lambda x: x == x.max(), axis=1)

但我想得到的是:

df2 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
    '01K W':[0, 0, 0, 0], 
    '02K W':[0, 2, 0, 0], 
    '03K W':[0, 0, 0, 5], 
    '04K W':[7, 0, 0, 5], 
    '05K W':[4, 2, 4.5, 0],
    '06K W':[0, 0, 0, 0],
    '07K W':[4, 3, 0, 0],
    '08K W':[0, 0, 9, 0],
    '09K W':[0, 4, 0, 6.3],
    '10K W':[0, 0, 9, 5.6]}) 
df2 = df2.set_index('Date')

非常感谢

DataFrame.rank

沿列轴对行进行降序排列,然后 mask 排名为 > 3

的值
df1.mask(df1.rank(axis=1, method='min', ascending=False).gt(3), 0)

            01K W  02K W  03K W  04K W  05K W  06K W  07K W  08K W  09K W  10K W
Date                                                                            
2021-01-01    0.0    0.0    0.0    7.0    4.0    0.0      4    0.0    0.0    0.0
2021-01-02    0.0    2.0    0.0    0.0    2.0    0.0      3    0.0    4.0    0.0
2021-01-03    0.0    0.0    0.0    0.0    4.5    0.0      0    9.0    0.0    9.0
2021-01-04    0.0    0.0    5.0    5.0    0.0    0.0      0    0.0    6.3    5.6