2016-04-09 19 views
3

Veri çerçevesi olarak 1000x1000 matrisim (kayan nokta sayıları) var. Sütunlar ve satırlar 0-1000'dir. Her satır için, en yüksek 10 değer ve bunların indeks bilgilerini istiyorum. Bu ilk başta düşündüğümden daha zor olduğu ortaya çıkıyor:Her bir veri çerçevesi satırı için, hem üst n değerlerini hem de sütun indislerini bulundukları yerlere getirin

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

Aynı zamanda üst-10 indeksleri bulmak için tamam ben başka yöntemlerle veya doğrudan endeksleme daha sonra değerler elde edebilirsiniz eğer.

+1

Ne tür bir sonuç beklediğinizi gösterir misiniz? – Abbas

+0

Yakın çoğaltma: [Veritabanındaki her satırın içinde hem üst n değerleri hem de içerdikleri sütunların adlarını alın] (http://stackoverflow.com/questions/40433682/get-both-the-top-n 'lik değerler-ve-isimleri-of-the kolonlar-onlar-meydana-in-içinde-her-ro/40434047 # 40434047). Ayrıca, [tag: top-n] etiketi kullanışlıdır. – smci

+0

"Satırları sırala ..." başlıklı orijinal başlık yanlıştı. Her satırdaki sütunları sıralamak istersiniz. Satırların sırası değişmeden kalır. – smci

cevap

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

Yöntem 1

, sadece ilk 10 değer olacak ve değerlerin sıfırlanması boş olacaktır girdi dataframe boyutu olarak aynı çıktıyı, bu nedenle dizinini verecek Her sütunun en iyi 10 değeri korunur.

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 

Yöntem 2 Bu endeks bilgileri ile seri bir listesini verecektir. ile

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

A deneyin:

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

Sadece değerlerin yerine getiri endeksi np.argsort, kullanabilir ve on tutmak sürer:

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

Testi:

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

th için e karşılık gelen değerler, örneğin sadece sort(df,axis=1)[:,-10:] yapın.