2016-04-09 3 views
3

У меня есть матрица 1000x1000 (чисел с плавающей запятой) в качестве кадра данных. Столбцы и строки - 0-1000. Для каждой строки я хочу 10 самых высоких значений и их индексную информацию. Это оказывается сложнее, чем я думал, что на первом:Для каждой строки dataframe получите как значения top-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

Рядом с дубликатом: [Получите как значения top-n, так и имена столбцов, в которых они встречаются, внутри каждой строки в dataframe] (http://stackoverflow.com/questions/40433682/get-both-the-top-n -значения-и-наименования-оф-колонна, они-происходят-в-в-каждый-ро/40434047 # 40434047). Кроме того, тег [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

Будет ли дать выход в такой же, как размер входного dataframe, только верхние 10 значений будет там и сброс значений будет нулевым, так что индекс верхние 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

попробовать с:

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

Просто используйте np.argsort, которые возвращают индексы вместо значений, и держать десять продолжается:

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:].

 Смежные вопросы

  • Нет связанных вопросов^_^