2016-06-02 4 views
0
data = pandas.DataFrame(numpy.random.randn(4,3)) 

print data 

Out[4]: 

      0   1   2 

0 -1.122880 -2.662009 1.180418 

1 -0.335768 0.162640 0.105928 

2 -1.282813 0.049638 1.532208 

3 -0.422884 -1.110049 0.031648 

Работа с огромным набором данных и я пытаюсь эффективно возвращать кортежи, которые ранжируют элементы DataFrame. Пробовал несколько неудобных последовательностей apply(), rank() и таких, но хотел что-то приятнее.pandas - ранжировать элементы dataframe

Ищет функцию вроде get_ranks(data), которая вернет упорядоченный набор (строк, столбцов) кортежей. Таким образом, для выше: (2,2), (0,2), (3,2), (1,1), ...

Я искал вокруг кучи, но не нашел комментариев к этому вопросу в частности. Должен ли я просто сгруппировать ряды или столбцы и ранжировать его оттуда? Или есть более прямой путь?

ответ

1

Вот что вы можете сделать:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame(np.random.randn(4,3))                  
>>> df 
      0   1   2 
0 1.644294 1.476467 -0.137539 
1 -0.448040 -0.329539 -0.996425 
2 -1.015308 -1.397746 0.369095 
3 -0.570194 -0.989716 -1.489257 
>>> df2 = pd.DataFrame(df.values.flatten()) 
>>> df2 
      0 
0 1.644294 
1 1.476467 
2 -0.137539 
3 -0.448040 
4 -0.329539 
5 -0.996425 
6 -1.015308 
7 -1.397746 
8 0.369095 
9 -0.570194 
10 -0.989716 
11 -1.489257 
>>> df3 = df2.rank() 
>>> df3['row'] = df3.index % 4 
>>> df3['column'] = (df3.index/4).astype(int)                  
>>> df3 
     0 row column 
0 12.0 0  0 
1 11.0 1  0 
2 9.0 2  0 
3 7.0 3  0 
4 8.0 0  1 
5 4.0 1  1 
6 3.0 2  1 
7 2.0 3  1 
8 10.0 0  2 
9 6.0 1  2 
10 5.0 2  2 
11 1.0 3  2 

Некоторые пояснения:

Я сплющивающиеся оригинальный DataFrame, а затем использовать rank(), чтобы получить ранг значений в массиве уплощенной. Затем я использую операции модуляции и деления, чтобы получить исходное положение значения.

В результате DataFrame имеет 3 столбца: первый - это ранг значения (12 -> max, 1 -> min), второй - индекс исходной строки значения, а третий - индекс исходного столбца значения.

Надеюсь, это будет полезно, и, пожалуйста, дайте мне знать, если это не совсем понятно.

+0

ничего себе, да, спасибо. работал с чем-то вроде, но определенно не так просто – user6412731

1

stack ваш dataframe, то sort_values с ascending=False, а затем принять index.tolist()

data.stack().sort_values(ascending=False).index.tolist() 
+0

это тоже здорово. большое спасибо – user6412731

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