【发布时间】:2017-05-19 14:42:01
【问题描述】:
我有一个数据框:
>>> df = pd.DataFrame({'row1' : [1,2,np.nan,4,5], 'row2' : [11,12,13,14,np.nan], 'row3':[22,22,23,24,25]}, index = 'a b c d e'.split()).T
>>> df
a b c d e
row1 1.0 2.0 NaN 4.0 5.0
row2 11.0 12.0 13.0 14.0 NaN
row3 22.0 22.0 23.0 24.0 25.0
和一个系列,它指定我想要从每行中获得的前 N 个值的数量
>>> n_max = pd.Series([2,3,4])
Panda 使用 df 和 n_max 找到每个元素中最大的 N 个元素的方法是什么(通过随机选择打破平局,就像 .nlargest() 会做的那样)?
想要的输出是
a b c d e
row1 NaN NaN NaN 4.0 5.0
row2 NaN 12.0 13.0 14.0 NaN
row3 22.0 NaN 23.0 24.0 25.0
我知道如何在所有行中使用统一/固定的 N(例如,N=4)。注意第 3 行的平局:
>>> df.stack().groupby(level=0).nlargest(4).unstack().reset_index(level=1, drop=True).reindex(columns=df.columns)
a b c d e
row1 1.0 2.0 NaN 4.0 5.0
row2 11.0 12.0 13.0 14.0 NaN
row3 22.0 NaN 23.0 24.0 25.0
但目标再次是具有特定行的N。循环遍历每一行显然不算数(出于性能原因)。而且我已经尝试使用带有面具的.rank(),但打破平局在那里不起作用......
【问题讨论】:
-
row3有第二个元素NaN-ed,而第一个元素与之有关联。那么,选择第二个元素的任何原因?如果选择其中任何一个有关系吗? -
没关系。这正是我评论
.nlargest()的行为的原因,它具有随机平局功能。 -
.rank有一个method参数来处理各种“关系”。 -
@ScottBoston,谢谢。仅此提示就解决了我的问题。我将使用
method='first'。 -
既然我们一直在寻找性能,您是否查看了这篇文章 - stackoverflow.com/a/44074289/3293881 ?
标签: pandas dataframe max rowwise