Python dataframe:为每列获取最高的n个非NaN值以及这些值的索引
我有一个pandas数据框,其中包含来自多个位置的值,跨越许多天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.
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的当天可能具有重要的值
我的问题是:
这是我第一次问问题,我很高兴澄清/改变任何事情。道歉,如果这是一个重复;我还没有找到同样情况的。谢谢 下面的循环将为您提供所需的内容。 您可以对每个位置的值进行排序,并将其分配给适当的
结果
和结果
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