首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于每个dataframe行,获取top-n值和它们出现的列索引

对于每个dataframe行,获取top-n值和它们出现的列索引
EN

Stack Overflow用户
提问于 2016-04-09 22:27:49
回答 3查看 3.3K关注 0票数 2

我有1000x1000的矩阵(浮点数)作为数据帧。列数和行数为0-1000。对于每一行,我想要前10个最高值及其索引信息。事实证明,这比我一开始想象的要难:

代码语言:javascript
复制
for row, index in df.iterrows():
    temp_row = row.copy()
    sort_row = temp_row.sort()
    # somehow I want indices as well

如果我稍后可以通过其他方法或直接索引获得值,也可以找到前10个索引。

EN

回答 3

Stack Overflow用户

发布于 2016-04-10 00:07:35

方法1

将提供与输入数据帧大小相同的输出,只有前10个值将存在,值的重置将为null,因此每列前10个值的索引将被保留。

代码语言:javascript
复制
In [2]: import pandas as pd

In [3]: import numpy as np

In [4]: df = pd.DataFrame(np.random.rand(100,100))

In [5]: out = df.apply(lambda x: x.sort_values(ascending=False).head(10), axis=0)

In [6]: out
Out[6]:
          0         1         2         3         4         5         6   \
0        NaN       NaN       NaN       NaN       NaN       NaN       NaN
1        NaN       NaN       NaN       NaN       NaN       NaN       NaN
2        NaN       NaN       NaN       NaN       NaN       NaN       NaN
3   0.884964       NaN       NaN       NaN       NaN       NaN       NaN
4        NaN       NaN       NaN       NaN       NaN       NaN       NaN
5        NaN       NaN       NaN       NaN  0.950102       NaN       NaN
6        NaN       NaN       NaN       NaN       NaN       NaN       NaN
7        NaN       NaN       NaN       NaN       NaN  0.990906       NaN
8        NaN       NaN       NaN       NaN       NaN       NaN       NaN
9        NaN       NaN       NaN       NaN       NaN       NaN  0.953309
10       NaN       NaN  0.932619       NaN       NaN       NaN       NaN
11       NaN       NaN       NaN       NaN       NaN       NaN  0.930249
12       NaN  0.907756       NaN       NaN       NaN       NaN       NaN
13       NaN       NaN       NaN       NaN       NaN       NaN       NaN
14       NaN       NaN       NaN       NaN       NaN       NaN       NaN
15       NaN       NaN       NaN       NaN       NaN  0.947548       NaN
16  0.952427       NaN       NaN  0.933285       NaN       NaN       NaN
17       NaN       NaN       NaN       NaN       NaN       NaN       NaN
18  0.908944       NaN       NaN       NaN       NaN  0.944756       NaN
19       NaN       NaN       NaN       NaN       NaN       NaN       NaN
20       NaN       NaN       NaN       NaN       NaN       NaN       NaN
21       NaN       NaN       NaN       NaN       NaN       NaN       NaN
22       NaN       NaN       NaN       NaN       NaN       NaN  0.936263
23       NaN       NaN       NaN       NaN  0.959198       NaN       NaN
24  0.938916       NaN       NaN       NaN       NaN  0.974316       NaN
25       NaN       NaN       NaN       NaN       NaN       NaN  0.901233
26       NaN       NaN       NaN       NaN       NaN       NaN       NaN
27       NaN       NaN       NaN       NaN       NaN       NaN       NaN
28       NaN       NaN  0.938866       NaN       NaN       NaN  0.948390
29       NaN       NaN       NaN       NaN       NaN       NaN       NaN

Method 2这将给出一个带有索引信息的序列列表。

代码语言:javascript
复制
In [7]: top10 = list()

In [8]: def process(col):
   ...:     top10.append(col.sort_values(ascending=False).head(10))
   ...:

In [9]: df.apply(process,axis=0)
In [10]: top10
Out[10]:
[47    0.968147
 65    0.959752
 16    0.952427
 24    0.938916
 69    0.936472
 60    0.922857
 63    0.922337
 18    0.908944
 95    0.888692
 3     0.884964
 Name: 0, dtype: float64, 41    0.993644
 39    0.976932
 77    0.969164
 47    0.966638
 32    0.963084
 72    0.941212
 42    0.922804
 49    0.919793
 64    0.917230
 12    0.907756
 Name: 1, dtype: float64, 56    0.994861
 33    0.985983
 37    0.985021
 79    0.981566
 63    0.975600
 53    0.953656
 35    0.940664
 28    0.938866
 86    0.933991
 10    0.932619
 Name: 2, dtype: float64, 50    0.999863
票数 2
EN

Stack Overflow用户

发布于 2016-04-09 23:43:07

代码语言:javascript
复制
bL = []    
for row, index in df.iterrows():
    temp_row = row.copy()
    temp_row.sort()         # in-memory sorting and it returns nothing.
    a = temp_row[-10:]      # the 10 largest numbers
    b = np.where( row >= a[0])  # get index of 10 largest numbers
    bL.append(b)                # save it
票数 0
EN

Stack Overflow用户

发布于 2016-04-10 00:36:32

尝试一下:

代码语言:javascript
复制
df=pd.DataFrame(rand(1000,1000)) # numbers in [0,1[

只需使用np.argsort,它返回的是索引而不是值,并保留前十个值:

代码语言:javascript
复制
In [5]: argsort(df,axis=1).iloc[:,-10:]  

"""  
   990  991  992  993  994  995  996  997  998  999
0  541  720  274  740  174  408  522  385  566  530
1  587  224   75  983  634   89  160  343  239  556
2  878  154  377  199  769  825  271  731  925   53
3  240  581  945  692  737   57  714  144  186  506
4  895  881  244  984  647  983  105  312  562  755
...
"""

测试:

代码语言:javascript
复制
In [7]: df.loc[0,541]
Out[7]: 0.9926658777347247  # a big number

例如,对于相应的值,只需执行sort(df,axis=1)[:,-10:]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36518092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档