Как найти положительные индексы столбцов в кадре данных с горячим кодированием? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть один горячий кадр данных с пандами в виде:

df

      A      B      C      D
ID
#1    2      1      0      1
#2    1      0      0      1
#3    1      1      1      0

df = pd.DataFrame({'ID_1':['#1','#1','#3','#1'], 'ID_2':['#2','#3',np.NaN,'#2'], \
          'ID_3':['#3', np.NaN, np.NaN, np.NaN] }, index=['A','B','C','D'])

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

new_df

      ID_1  ID_2   ID_3
c_id
A     #1     #2     #3      
B     #1     #3            
C     #3      
D     #1     #2

Я понимаю, что нужно как-то повернуть кадр данных, но я несмог найти эффективный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

вы можете использовать argsort из numpy, чтобы получить позицию значений в нужном вам порядке, а затем mask , чтобы заменить значение 0 в отсортированном массиве:

import numpy as np
arr = df.values.T
new_df = (pd.DataFrame( data = df.index[np.argsort( -arr, axis=1)].values,
                        index = pd.Index(df.columns,name='c_id'),
                        columns='ID_' + df.index.str[1:])
            .mask(np.sort( -arr, axis=1) == 0,''))

тогда вы получите

print(new_df)
     ID_1 ID_2 ID_3
c_id               
A      #1   #2   #3
B      #1   #3     
C      #3          
D      #1   #2   
0 голосов
/ 24 декабря 2018

Сначала используйте gt, чтобы df стал Boolean, затем используйте mul, затем мы сортируем ваш столбец по isnull или нет.

df.gt(0).mul(df.index.values,0).T.replace('',np.nan).apply(lambda x : sorted(x,key=pd.isnull),1)
ID  #1   #2   #3
A   #1   #2   #3
B   #1   #3  NaN
C   #3  NaN  NaN
D   #1   #2  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...