在论坛上有很多例子,如何找到行的最大值与相应的列名。一些例子是here或here
我想做的是对上面的例子进行一些具体的修改。我的框架看起来像这样,其中所有列都是从左到右编号的(这个顺序非常重要):
x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10
0 0 1 2 2 0 0 0 0 0
4 4 0 4 4 1 0 0 0 0
0 0 1 2 3 0 0 0 0 0
字符串
现在,我想在每行的末尾创建6个新列,列名称和行中最大的值。
x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10 Max1 ValMax1 Max2 ValMax2 Max3 ValMax3
0 0 1 2 2 0 0 0 0 0
4 4 0 4 4 1 0 0 0 0
0 0 1 2 3 0 0 0 0 0
型
如果某行有多个,则最多只有1个(例如第一行中的值2),我想在列Max 1中保存一个索引最小的列名。在这种情况下,第二大值也是2,但相应的列具有更大的索引。这意味着,必须在“Max(y)”列中保存只有一个列名。这是主要条件。在这种情况下,如果某行具有超过3个max值,只需要保存3个索引最小的列名。所以最终的输出应该像这样的DF:
x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10 Max1 ValMax1 Max2 ValMax2 Max3 ValMax3
0 0 1 2 2 0 0 0 0 0 x_4 2 x_5 2 x_3 1
4 4 0 4 4 1 0 0 0 0 x_1 4 x_2 4 x_4 4
0 0 1 2 3 0 0 0 0 0 x_5 3 x_4 2 x_3 1
型
总结一下,我们有了下一个结果:第一行4 < 5,表示4先到(无论如何,第二个2立即出现在下一列)。在第二行1 < 2 < 4 < 5中,我们只有3列,因此最终结果中缺少5。在第三行中,索引不起任何作用,因为我们在行中有严格不同的值。这也是主要条件。
5条答案
按热度按时间lvmkulzt1#
为了实现有效的方法,需要使用numpy的
argpartition
和索引进行向量化:字符串
输出量:
型
iswrvxsc2#
在NumPy中这样做似乎更有意义,然后在最后获得列名。
我写了一个函数,你可以用它来获取数组的顶部
n
索引。它的工作原理是使用np.nanargmax
,然后在再次执行之前将值屏蔽为NaN。(可能有更好的方法来做到这一点,但这只是我首先想到的。)字符串
用法如下:
型
然后你可以构建你想要的DataFrame,如果需要的话,可以用原始的DataFrame
.join
它。的字符串
vc9ivgsu3#
使用下面的代码块,它首先创建了一个Xrame
df_copy
的副本,其中列名被替换为相应的数字索引(正如你提到的顺序很重要)。然后它对每一行应用一个函数来获取前3个最大值的索引。然后这些索引被Map回原始列名。最后,它获取这些列的值,并且当然按预期对列进行重新排序。字符串
结果(如预期):
型
33qvvth14#
你也可以尝试这样的东西:
字符串
输出量:
型
evrscar25#
你可以试试
rank
字符串
创建df你可以使用相同的方法像mozway