Отменить кодировку get_dummies в пандах - PullRequest
0 голосов
/ 30 мая 2018

Имена столбцов: ID, 1,2,3,4,5,6,7,8,9.

Значения столбцов: 0 или 1

Мой кадр данных выглядиткак это:

 ID     1    2    3    4    5    6   7   8   9 

1002    0    1    0    1    0    0   0   0   0
1003    0    0    0    0    0    0   0   0   0 
1004    1    1    0    0    0    0   0   0   0
1005    0    0    0    0    1    0   0   0   0
1006    0    0    0    0    0    1   0   0   0
1007    1    0    1    0    0    0   0   0   0
1000    0    0    0    0    0    0   0   0   0
1009    0    0    1    0    0    0   1   0   0

Я хочу, чтобы имена столбцов перед идентификатором, где значение в строке равно 1.

Нужный мне фрейм данных должен выглядеть так:

 ID      Col2
1002       2    // has 1 at Col(2) and Col(4)
1002       4    
1004       1    // has 1 at col(1) and col(2)
1004       2
1005       5    // has 1 at col(5)
1006       6    // has 1 at col(6)
1007       1    // has 1 at col(1) and col(3)
1007       3
1009       3    // has 1 at col(3) and col(7)
1009       7

Пожалуйста, помогите мне в этом, заранее спасибо

Ответы [ 4 ]

0 голосов
/ 19 апреля 2019

https://stackoverflow.com/a/55757342/2384397

переписывание здесь: Преобразование данных ["классификация"] в одно горячее кодирование и обратно !!

импорт панд в виде pd

из sklearn.preprocessingimport LabelEncoder

dat ["метки"] = le.fit_transform (dat ["классификация"])

Y = pd.get_dummies (dat ["метки"])

tru = []

для i в диапазоне (0, len (Y)): tru.append (np.argmax (Y.iloc [i])) *

tru = le.inverse_transform (tru)

Идентичная проверка!(TRU == Дат [ "классификация"]). Value_counts ()

0 голосов
/ 30 мая 2018

set_index + stack, стек по умолчанию будет сброшен

df.set_index('ID',inplace=True)

df[df==1].stack().reset_index().drop(0,1)
Out[363]: 
     ID level_1
0  1002       2
1  1002       4
2  1004       1
3  1004       2
4  1005       5
5  1006       6
6  1007       1
7  1007       3
8  1009       3
9  1009       7
0 голосов
/ 30 мая 2018

np.argwhere

v = np.argwhere(df.drop('ID', 1).values).T
pd.DataFrame({'ID' : df.loc[v[0], 'ID'], 'Col2' : df.columns[1:][v[1]]})

  Col2    ID
0    2  1002
0    4  1002
2    1  1004
2    2  1004
3    5  1005
4    6  1006
5    1  1007
5    3  1007
7    3  1009
7    7  1009

argwhere получает индексы i, j всех ненулевых элементов в вашем DataFrame.Используйте первый столбец индексов для индексации в столбец ID, а второй столбец индексов для индексации в df.columns.

Я перевожу v перед шагом 2 для повышения эффективности кэша и уменьшения числа набранных текстов.

0 голосов
/ 30 мая 2018

Использование:

df = (df.melt('ID', var_name='Col2')
       .query('value== 1')
       .sort_values(['ID', 'Col2'])
       .drop('value',1))

Альтернативное решение:

df = (df.set_index('ID')
        .mask(lambda x: x == 0)
        .stack()
        .reset_index()
        .drop(0,1))

print (df)
      ID Col2
8   1002    2
24  1002    4
2   1004    1
10  1004    2
35  1005    5
44  1006    6
5   1007    1
21  1007    3
23  1009    3
55  1009    7

Объяснение :

1.Первое изменение формызначения melt или set_index с unstack 2. Только фильтр 1 с query или преобразование0 до NaN с mask 3. sort_values для первого решения 4.создать столбцы от MultiIndex до reset_index5. Последнее удаление ненужных столбцов на drop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...