For each dataframe row, get both the top-n values and the column-indices where they occur

依然范特西╮ 提交于 2019-12-10 22:46:06

问题


I have 1000x1000 matrix (of floating point numbers) as dataframe. Columns and rows are 0-1000. For each row, I want top-10 highest values and their index information. This turns out to be harder than I thought at first:

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

It is also okay to find top-10 indices, if I can get the values later by some other method or direct indexing.


回答1:


Method 1

Will give the output as same as the size of the input dataframe, only the top 10 values will be there and reset of the values will be null, so the index of top 10 values of each column is retained.

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 This will give a list of series with index information.

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:


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



回答3:


A try with:

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

Just use np.argsort,that return the indices instead of values, and keep the ten lasts:

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

Test :

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

For the corresponding values, just do sort(df,axis=1)[:,-10:] for example.



来源:https://stackoverflow.com/questions/36518092/for-each-dataframe-row-get-both-the-top-n-values-and-the-column-indices-where-t

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!