【问题标题】:Only keep the top N values of each row in dataframe and set other to zero仅保留数据框中每行的前 N ​​个值,并将其他值设置为零
【发布时间】:2021-12-20 03:08:31
【问题描述】:

我试图保留每个日期/行的前 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')

非常感谢

【问题讨论】:

    标签: python pandas apply


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 1970-01-01
      • 2021-03-03
      • 2015-10-19
      • 2018-03-13
      • 2022-11-14
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多