Сортировать строку данных с сохранением столбцов - PullRequest
0 голосов
/ 26 января 2019

У меня есть датафрейм для панд, как показано ниже:

         U1      U2      U3                                                      
U1       1.0     0.0     0.2 
U2       0.4     1.0     0.0
U3       0.0     0.45    1.0 

Здесь U1, U2 и U3 - индексы и заголовки столбцов. Я хочу отсортировать значения в каждой строке, а затем выбрать 20 лучших из каждой строки. Однако после сортировки мне также нужно знать, какое конкретное значение исходит из какой строки и столбца. Например, если я отсортирую каждую строку отдельно, я получу:

         U2      U3      U1                                                      
U1       0.0     0.2     1.0 

для 1-го ряда

         U3      U1      U2                                                     
U2       0.0     0.4     1.0

для 2-го ряда

         U1      U2      U3                                                      
U3       0.0     0.45    1.0 

для 3-го ряда.

Однако порядок столбцов теперь отличается для каждой строки. Есть ли эффективный способ / структура данных (предпочтительно, фрейм данных или массив numpy), где я могу агрегировать эту отсортированную информацию?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Может быть, это поможет, где вы можете получить результат с одиночной сортировкой!

pd.DataFrame(list(df.apply(lambda x : sorted((x,c) for x,c in zip(x,df.columns)),axis=1)),
             index=df.index)

         0           1              2
U1  (0.0, 'U2') (0.2, 'U3')     (1.0, 'U1')
U2  (0.0, 'U3') (0.4, 'U1')     (1.0, 'U2')
U3  (0.0, 'U1') (0.45, 'U2')    (1.0, 'U3')
0 голосов
/ 26 января 2019

Вы можете использовать numpy.argsort для позиций, а затем изменить порядок значений столбцов и значений DataFrame:

pos = df.values.argsort(axis=1)
df1 = pd.DataFrame(df.columns[pos], index=df.index)
print (df1)
     0   1   2
U1  U2  U3  U1
U2  U3  U1  U2
U3  U1  U2  U3

arr1 = df.columns.values[pos]
print (arr1)
[['U2' 'U3' 'U1']
 ['U3' 'U1' 'U2']
 ['U1' 'U2' 'U3']]

Для изменения позиций на pos использовать:

df2 = pd.DataFrame(df.values[np.arange(len(df))[:, None], pos], index=df.index)
print (df2)
      0     1    2
U1  0.0  0.20  1.0
U2  0.0  0.40  1.0
U3  0.0  0.45  1.0

arr2 = df.values[np.arange(len(df))[:, None], pos]
print (arr2)
[[0.   0.2  1.  ]
 [0.   0.4  1.  ]
 [0.   0.45 1.  ]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...