Python dataframe:为每列获取最高的n个非NaN值以及这些值的索引

Python dataframe:为每列获取最高的n个非NaN值以及这些值的索引,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个pandas数据框,其中包含来自多个位置的值,跨越许多天 import pandas as pd import numpy as np df = pd.DataFrame({'day': [1, 2, 3, 4, 5, 6], 'location-1': [10, 24, 24, 85, 90, np.NaN], 'location-2': [np.NaN, np.NaN, 45, 28, np.NaN, np.

我有一个pandas数据框,其中包含来自多个位置的值,跨越许多天

import pandas as pd
import numpy as np
df = pd.DataFrame({'day': [1, 2, 3, 4, 5, 6],
                   'location-1': [10, 24, 24, 85, 90, np.NaN],
                   'location-2': [np.NaN, np.NaN, 45, 28, np.NaN, np.NaN]})
df.set_index('day', inplace=True)
我需要得到每个位置的4个最高值,以及它们发生的日期。NaN值需要放在最后。大致如下:

result = pd.DataFrame({'location-1': [90, 85, 24, 24],
                       'location-2': [45, 29, np.NaN, np.NaN]})
result_days = pd.DataFrame({'location-1': [5, 4, 3, 2],
                            'location-2': [3, 4, 6, 5]})
    
我在这里找到了部分解决方案:

但是这个解决方案把NaN排在第一位,我找不到一个na_位置选项。我看到了一些解决方案,然后手动将每个列的NaN循环到底,但我事先不知道哪些列包含NaN,而且还必须跟踪日期。我不能使用dropna,因为一个位置在另一个位置具有NaN的当天可能具有重要的值

我的问题是:

  • 如何有效地对其进行排序,并提取最高的非NaN值?我可以破解它,并在排序之前用-999替换NaN,但我想看看是否存在一个不依赖于我的数字高于某个特定值的假设的通用解决方案
  • 如何有效地提取问题1中数值的天数(或行指数)?可能会有重复的高值(如位置1),为此,我需要先到最近一天。我见过一些使用np.argsort和np.argpartition的解决方案,但我认为它们可能取决于这里如何处理NaN

  • 这是我第一次问问题,我很高兴澄清/改变任何事情。道歉,如果这是一个重复;我还没有找到同样情况的。谢谢

    下面的循环将为您提供所需的内容。 您可以对每个位置的值进行排序,并将其分配给适当的
    结果
    结果

    cols = ['location-1', 'location-2']
    result = pd.DataFrame(columns=cols)
    result_days  = pd.DataFrame(columns=cols)
    
    for c in cols:
        tmp = df.sort_values(c, ascending=False).head(4)
        result[c] = tmp[c].values
        result_days[c] = tmp.index.values
    
    print(result)
    print(result_days)
    
       location-1  location-2
    0        90.0        45.0
    1        85.0        28.0
    2        24.0         NaN
    3        24.0         NaN
       location-1  location-2
    0           5           3
    1           4           4
    2           2           1
    3           3           2