Python — одно горячее кодирование в один столбец

У меня почти нулевой опыт работы с Python, но я пытаюсь его изучить. У меня есть кадр данных Pandas, который поставляется с некоторыми манекенами. Я хочу преобразовать их обратно в один столбец, но я просто не могу понять, как это сделать. Есть ли способ сделать это?

У меня есть это:

ID   var_1 var_2 var_3 var_4
231    1     0     0    0
220    0     1     0    0
303    0     0     1    0
324    0     0     0    1

Мне нужно преобразовать в него:

ID   var  
231    1   
220    2   
303    3    
324    4

person Rods2292    schedule 28.07.2018    source источник


Ответы (2)


Предполагая, что это действительно однократное кодирование, используйте np.argmax по первой оси:

pd.DataFrame({'ID' : df['ID'], 'var' : df.iloc[:, 1:].values.argmax(axis=1) + 1})

    ID  var
0  231    1
1  220    2
2  303    3
3  324    4

Однако, если «ID» является частью индекса, используйте вместо этого:

pd.DataFrame({'ID' : df.index, 'var' : df.values.argmax(axis=1)})
person cs95    schedule 28.07.2018

Попробуйте что-нибудь новое wide_to_long

s=pd.wide_to_long(df,['var'],i='ID',j='Var',sep='_')
s[s['var']==1].reset_index().drop('var',1)
Out[593]: 
    ID Var
0  231   1
1  220   2
2  303   3
3  324   4
person BENY    schedule 28.07.2018
comment
Мне понравился этот ответ, но он здесь не работает. У меня есть переменная без разделителя, поэтому я просто применил ваш код без аргумента sep. И я получил эту ошибку: ValueError: Shape of passed values is (2, 2), indices imply (2, 66899) - person Rods2292; 29.07.2018
comment
@Rods2292 Rods2292 Если ответ не решает вашу проблему, то, пожалуйста, задайте свой вопрос таким образом, чтобы решение, естественно, должно было преодолеть его, чтобы быть приемлемым. Звучит неплохо? В противном случае, пожалуйста, будьте честны и протестируйте все решения, прежде чем решить, на чем остановиться. - person cs95; 29.07.2018