Панды, поменять одну горячую кодировку - PullRequest
3 голосов
/ 20 июня 2019

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

Что я делаю, так это:

Я фильтрую имена столбцов с одним горячим кодированием (все они начинаются с имени исходной переменной, скажем, 'mycol')

filter_col = [col for col in df if col.startswith('mycol')]

Тогда я могу просто умножить имена столбцов на отфильтрованные переменные.

X_test[filter_col]*filter_col

Однако это приводит к разреженной матрице. Как мне создать одну переменную из этого? Суммирование не работает, поскольку пустые пространства обрабатываются как числа и делают это: sum(X_test[filter_col]*filter_col) Я получаю

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Есть предложения о том, как поступить? Это даже лучший подход или какая-то функция выполняет именно то, что мне нужно?

В качестве запроса, вот пример, взятый из здесь :

df= pd.DataFrame({ 
    'mycol':np.random.choice( ['panda','python','shark'], 10),
    })

df=pd.get_dummies(df)

Ответы [ 2 ]

1 голос
/ 20 июня 2019

IIUC, вы можете использовать DataFrame.idxmax вдоль axis=1.При необходимости вы можете заменить фиктивный префикс на str.replace:

X_test[filter_col].idxmax(axis=1).str.replace('mycol_', '')
1 голос
/ 20 июня 2019

Если нужны значения суммы в строках:

(X_test[filter_col]*filter_col).sum(axis=1)

Решение, если возможно, только 0 на строки или несколько 1 на строки:

X_test = pd.DataFrame({
         'mycolB':[0,1,1,0],
         'mycolC':[0,0,1,0],
         'mycolD':[1,0,0,0],

})


filter_col = [col for col in X_test if col.startswith('mycol')]
df = X_test[filter_col].dot(pd.Index(filter_col) + ', ' ).str.strip(', ')
print (df)
0            mycolD
1            mycolB
2    mycolB, mycolC
3                  
dtype: object
...