我有一只熊猫的数据,价值来自多个地点,跨越许多天。
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]})我在这里找到了一个部分解决方案:Get top 4 biggest values from each column using Pandas in Python
但是该解决方案将NaN排序到顶部,我无法找到用于此的na_position选项。我看到了一些解决方案,然后手动将每个列的NaN循环到底部,但我之前并不知道哪些列包含NaN,而且还必须跟踪日期。我不能使用下拉列表,因为在另一个位置有NaN的当天,一个位置可能有重要的值。
我的问题是:
这是我第一次问问题,我很乐意澄清/改变任何事情。如果这是重复的话,很抱歉;我没有找到同样的情况。谢谢!
发布于 2021-05-08 21:25:34
下面的循环将提供您所需的内容。您可以sort_values每个位置并将其分配给适当的result和result_days。
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 2https://stackoverflow.com/questions/67452157
复制相似问题