2017-02-10 2 views
2

Как я могу (эффективно для матрицы, намного большей, чем представленный пример) возвращать имя столбца и индекс (или имя строки) для n или наименьшее значениеВозвращает индекс и имя столбца n-го наибольшего значения в серии данных Pandas

import pandas as pd 
import numpy as np 

dates = pd.date_range('20130101', periods=6) 
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) 
matrix = df.corr() 
matrix 
      A   B   C   D 
A 1.000000 -0.814913 0.495993 -0.880296 
B -0.814913 1.000000 -0.211421 0.551441 
C 0.495993 -0.211421 1.000000 -0.414037 
D -0.880296 0.551441 -0.414037 1.000000 

Тогда я хотел бы сделать что-то такое, как

def get_n_smallest(matrix, n): 
    # can return as two variables, list, tuple, whatever... 
    return row_name, col_name 

get_n_smallest(matrix,0) 
# would return D, A for the value -.880296 
+0

@JohnGalt но это только самый низкий, а не п-й самый низкий – thefoxrocks

+0

Правда, как о 'matrix.unstack() sort_values ​​() индекс [.. n-1] 'для n-го наименьшего? – Zero

ответ

1

Я думаю, что вы можете использовать stack для Series, а затем удалить дубликаты по drop_duplicates, sort_values и получить MultiIndex значения по индексации index:

np.random.seed(100) 
dates = pd.date_range('20130101', periods=6) 
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) 
matrix = df.corr() 
print (matrix) 
      A   B   C   D 
A 1.000000 0.570860 -0.558334 -0.434793 
B 0.570860 1.000000 -0.358834 -0.564178 
C -0.558334 -0.358834 1.000000 0.170589 
D -0.434793 -0.564178 0.170589 1.000000 

print (matrix.stack().drop_duplicates().sort_values()) 
B D -0.564178 
A C -0.558334 
    D -0.434793 
B C -0.358834 
C D 0.170589 
A B 0.570860 
    A 1.000000 
dtype: float64 

def get_n_smallest(matrix, n): 
    return matrix.stack().drop_duplicates().sort_values().index[n] 

print (get_n_smallest(matrix,0)) 
('B', 'D') 

print (get_n_smallest(matrix,1)) 
('A', 'C') 

print (get_n_smallest(matrix,2)) 
('A', 'D') 

def get_n_largest(matrix, n): 
    return matrix.stack().drop_duplicates().sort_values(ascending=False).index[n] 


print (get_n_largest(matrix,0)) 
('A', 'A') 

print (get_n_largest(matrix,1)) 
('A', 'B') 

print (get_n_largest(matrix,2)) 
('C', 'D') 
Смежные вопросы