2015-11-29 4 views
2

Предположим, у меня есть матрица 750x750, помещенная в DataFrame, скажем, df.Как получить имя столбца, используя значения в фрейме данных?

df= 

     c1 c2 c3 ... c750 
c1  5 2 5 ... 3 
c2  3 1 5 ... 80 
c3  4 2 7 ... 10 
.  . . . ... . 
.  . . . ... . 
.  . . . ... . 
c750 8 3 5 ... 1 

Я хочу выяснить 4 высшего значения, содержащую столбец для каждой строки, я могу легко сделать это с помощью:

a = df.values 
a.sort(axis=1) 
sorted_table = a[:,-4::] 
b = a[:,::-1] 

Однако, результат я получаю это просто список, без имя индекса и столбца.

[[ 98.  29.  15.  10.] 
[ 93.  91.  75.  60.] 
[ 48.  21.  17.  10.] 
. 
. 
. 
...] 

Что делать, если я хочу знать, какое имя столбца относится к отсортированным значениям?

Я хотел бы показать:

df= 

c1  c512 c20 c57  c310 
c2  c317 c133 c584 c80 
c3  c499 c289 c703 c100 
.  . . . ... . 
.  . . . ... . 
.  . . . ... . 
c750 c89 c31 c546  c107 

где

c512 is referring to 98 

    c20 is referring to 29 

    c57 is referring to 15 

and so and so. 
+0

Вы можете использовать 'df.apply (MyFunc, ось = 1)' вместо 'df.sort'. Это позволит вам манипулировать именами столбцов вместе со своими значениями. –

+0

У вас есть пример результата, который вы хотите? Проблема, которую я вижу, состоит в том, что столбец может иметь несколько строк с наивысшими значениями, поэтому сортировка по этой строке может отображаться так, как вы хотите. Как вы хотите отображать имена столбцов для каждой строки с наивысшими значениями? – Jarad

+0

@Jarad, я бы хотел отобразить данные как обновлено выше. Надеюсь, вы можете дать мне некоторые идеи для этого. –

ответ

1

Я сомневаюсь, что это лучший ответ, но я думаю, что это работает. Я ненавижу использовать петли for в пандах, но я не мог придумать способ pandas сделать это.

import pandas as pd 
import numpy as np 

#array_size = 10 

#--- Generate Data and create toy Dataframe --- 
array_size = 750 
np.random.seed(1) 
data = np.random.randint(0, 1000000, array_size**2) 
data = data.reshape((array_size, array_size)) 
df = pd.DataFrame(data, columns=['c'+str(i) for i in range(1, (array_size)+1)]) 
df.index = df.columns 

#--- Transpose the dataframe to more familiarly sort by columns instead of rows --- 
df = df.T 

#--- Rank values in dataframe using max method where highest value is rank 1 --- 
df = df.rank(method='max', ascending=False) 

#--- Create empty dataframe to put data into --- 
new_df = pd.DataFrame() 

#--- For loop for each column to get top ranks less than 5, sort them, reset index, drop i column 
for i in df.columns: 
    s = df[i][df[i] < 5].sort_values().reset_index().drop(i, axis=1) 
    new_df = pd.concat([new_df, s.T]) 

#--- The new_df index will say 'index', this reassigns the transposed column names to new_df's index 
new_df.index = df.columns 
print(new_df) 

Выходы:

  0  1  2  3 
c1 c479 c545 c614 c220 
c2 c249 c535 c231 c680 
c3 c657 c603 c137 c740 
c4 c674 c424 c426 c127 
... ... ... ... ... 
c747 c251 c536 c321 c296 
c748 c55 c383 c437 c103 
c749 c138 c495 c299 c295 
c750 c178 c556 c491 c445 
Смежные вопросы