对于每个数据帧行,获取前n个值和它们出现的列索引

时间:2016-04-09 14:27:49

标签: python pandas dataframe floating-point top-n

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

for row, index in df.iterrows():
    temp_row = row.copy()
    sort_row = temp_row.sort()
    # somehow I want indices as well

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

3 个答案:

答案 0 :(得分:2)

方法1

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

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

方法2 这将给出一个包含索引信息的系列列表。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试:

df=pd.DataFrame(rand(1000,1000)) # numbers in [0,1[

只需使用np.argsort,即返回索引而不是值,并保持十个持续时间:

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
...
"""

测试:

In [7]: df.loc[0,541]
Out[7]: 0.9926658777347247  # a big number

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