Python/Pandas:查找最大值的索引并仅保留高于某个值的索引
我想检索与列集合对应的n个列名,其中n个最大值。 然后,仅当值高于给定阈值时,才将这些名称保留在列表中 例如,给定三列“Paul”、“Eric”、“Marc”,假设我最多需要两个列名,阈值为0.5。然后,我将获得“最佳”一栏,如下所示: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
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]