2016-04-09 6 views
3

データフレームとして(浮動小数点数の)1000x1000の行列があります。列と行は0〜1000です。各行について、上位10個の最高値とそのインデックス情報が必要です。各データフレーム行に対して、上位n個の値とそれらが発生する列インデックスを取得します。

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

私はいくつかの他の方法または直接インデックスにより、後の値を取得することができればトップ10の指標を見つけることも大丈夫です:これは私が最初に思ったよりも難しいことが判明します。

+1

あなたは期待しているものがどんなものかを教えてください。 – Abbas

+0

ニア・デュプリケート:[上位n個の値と、それらがデータ・フレーム内の各行内で発生する列の名前を取得する](http://stackoverflow.com/questions/40433682/get-both-the-top-n列の値と列の名前は、それぞれの内部/ 40434047#40434047内で発生します。また、tag [tag:top-n]は便利です。 – smci

+0

元のタイトル「行をソートする...」が間違っていました。各行内の列を並べ替える必要があります。行の順序は変更されません。 – smci

答えて

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

方法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.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 

方法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 
0

A試してみてください。

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

ジャスト値の代わりにインデックスを返すnp.argsortを、使用、および10を維持することは続く:

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 

e対応値は、たとえばsort(df,axis=1)[:,-10:]となります。

関連する問題