Python/Pandas:查找最大值的索引并仅保留高于某个值的索引

Python/Pandas:查找最大值的索引并仅保留高于某个值的索引,python,pandas,Python,Pandas,我想检索与列集合对应的n个列名,其中n个最大值。 然后,仅当值高于给定阈值时,才将这些名称保留在列表中 例如,给定三列“Paul”、“Eric”、“Marc”,假设我最多需要两个列名,阈值为0.5。然后,我将获得“最佳”一栏,如下所示: import pandas as pd import numpy as np start = '2020-01-01 00:00+00:00' end = '2020-01-01 05:00+00:00' pr1h = pd.period_range(sta

我想检索与列集合对应的n个列名,其中n个最大值。 然后,仅当值高于给定阈值时,才将这些名称保留在列表中

例如,给定三列“Paul”、“Eric”、“Marc”,假设我最多需要两个列名,阈值为0.5。然后,我将获得“最佳”一栏,如下所示:

import pandas as pd
import numpy as np

start = '2020-01-01 00:00+00:00'
end = '2020-01-01 05:00+00:00'

pr1h = pd.period_range(start=start, end=end, freq='1h')
r = len(pr1h)

df = pd.DataFrame(np.random.rand(r,3), index=pr1h, columns=['Paul', 'Marc', 'Eric'])
处理后:

df
                      Paul      Marc      Eric            Bests
2020-01-01 00:00  0.124974  0.525182  0.415339         ['Marc']
2020-01-01 01:00  0.991917  0.489479  0.668359 ['Paul', 'Eric']
2020-01-01 02:00  0.204156  0.610034  0.644715 ['Eric', 'Marc']
2020-01-01 03:00  0.385546  0.981641  0.089667         ['Marc']
2020-01-01 04:00  0.912330  0.711822  0.148064 ['Paul', 'Marc']
2020-01-01 05:00  0.301186  0.313572  0.323487               []
我可以在上找到,这显示了一种根据给定行中值的排名来获取索引的方法。 我想这可能是一个起点(可能在速度方面没有优化,因为跑了几次,但这似乎是一个好的开始)

我可以:

df1['1st_largest'] = df.columns[df.values.argsort(1)[:,-1]]
df2['2nd_largest'] = df.columns[df.values.argsort(1)[:,-2]]
我的数组不应该超过20到50列,因此我使用
argsort
而不是
argpartition

但现在,我被卡住了。我不知道如何检查与其中一列相关的值是否高于0.5,以便将其放入列表中


欢迎提供任何帮助,谢谢!

一种方法是使用
where
堆栈来屏蔽数据帧:

df['Bests'] = (df.where(df.gt(0.5))         # change 0.5 to your threshold
                 .stack().groupby(level=0)
                 .apply(lambda x: x.nlargest(2).index
                                   .get_level_values(1).to_list()
                       )
              )
输出:

                      Paul      Marc      Eric         Bests
2020-01-01 00:00  0.124974  0.525182  0.415339        [Marc]
2020-01-01 01:00  0.991917  0.489479  0.668359  [Paul, Eric]
2020-01-01 02:00  0.204156  0.610034  0.644715  [Eric, Marc]
2020-01-01 03:00  0.385546  0.981641  0.089667        [Marc]
2020-01-01 04:00  0.912330  0.711822  0.148064  [Paul, Marc]
2020-01-01 05:00  0.301186  0.313572  0.323487           NaN

与Quang的想法相同,但使用
GroupBy.agg(list)


您好@r.ook,预期的输出是“Bests”列。如果您运行代码,您将看到它只提供了3列“Paul”、“Marc”、“Eric”。BestsAh好的,我误解了这个问题。我想@QuangHoang已经涵盖了您。斋月穆巴拉克:)@Erfan,非常感谢您的帮助。我比较了这两种解决方案的执行时间,不幸的是,这一个确实比Quang需要两倍多的时间。尽管如此,还是要谢谢你!谢谢,我保留了你的解决方案。谢谢!
dfg = df.where(df>0.5).stack().groupby(level=0).nlargest(2)
df['Bests'] = dfg.reset_index(level=2).groupby(level=0)['level_2'].agg(list)

                      Paul      Marc      Eric         Bests
2020-01-01 00:00  0.494089  0.500048  0.398106        [Marc]
2020-01-01 01:00  0.571067  0.896135  0.445951  [Marc, Paul]
2020-01-01 02:00  0.769473  0.830661  0.909551  [Eric, Marc]
2020-01-01 03:00  0.828074  0.025853  0.670196  [Paul, Eric]
2020-01-01 04:00  0.651157  0.641126  0.346411  [Paul, Marc]
2020-01-01 05:00  0.752359  0.970789  0.231323  [Marc, Paul]