问题
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