2016-04-09 9 views
3

Ich habe 1000x1000 Matrix (von Fließkommazahlen) als Datenframe. Spalten und Zeilen sind 0-1000. Für jede Zeile möchte ich Top-10-höchste Werte und ihre Indexinformationen. Dies erweist sich als schwieriger als ich zuerst dachte:Erhalten Sie für jede Datenfeldzeile sowohl die Top-n-Werte als auch die Spaltenindizes, wo sie vorkommen.

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

Es ist auch in Ordnung Top-10-Indizes zu finden, wenn ich die Werte später durch ein anderes Verfahren oder direkte Indizierung bekommen.

+1

Können Sie bitte zeigen, welche Art von Ausgang Sie erwarten? – Abbas

+0

Near-duplicate: [Erhalte sowohl die Top-n-Werte als auch die Namen der Spalten, in denen sie vorkommen, innerhalb jeder Zeile im Dataframe] (http://stackoverflow.com/questions/40433682/get-both-the-top-n -Values-und-die-Namen-der-Spalten-sie-auftreten-in-jedem-ro/40434047 # 40434047). Auch das Tag [tag: top-n] ist nützlich. – smci

+0

Der ursprüngliche Titel "Sortiere die Zeilen ..." war falsch. Sie möchten die Spalten innerhalb jeder Zeile sortieren. Die Reihenfolge der Zeilen bleibt unverändert. – smci

Antwort

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 
1

Methode 1

Wird die Ausgabe als elbe wie die Größe des Eingangsdatenrahmen geben, werden nur die Top-10-Werte es sein wird, und Rücksetzen der Werte null sein, so dass der Index der Die oberen 10 Werte jeder Spalte werden beibehalten.

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

Methode 2 Dies wird eine Liste der Serie mit Indexinformationen geben.

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 
0

Ein Versuch mit:

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

Nur np.argsort verwenden, die die Indizes statt Werte zurückgeben, und die zehn halten dauert:

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 

Für th Die entsprechenden Werte, tun Sie zum Beispiel sort(df,axis=1)[:,-10:].