Konwersja wartości kategorycznych na binarne za pomocą pand

Próbuję przekonwertować wartości kategoryczne na wartości binarne za pomocą pand. Chodzi o to, aby rozważyć każdą unikalną wartość kategoryczną jako cechę (tj. kolumnę) i umieścić 1 lub 0 w zależności od tego, czy dany obiekt (tj. wiersz) został przypisany do tej kategorii. Kod:

data = pd.read_csv('somedata.csv')
converted_val = data.T.to_dict().values()
vectorizer = DV( sparse = False )
vec_x = vectorizer.fit_transform( converted_val )
numpy.savetxt('out.csv',vec_x,fmt='%10.0f',delimiter=',')

Moje pytanie brzmi, jak zapisać przekonwertowane dane z nazwami kolumn?. W powyższym kodzie mogę zapisać dane za pomocą funkcji numpy.savetxt, ale to po prostu zapisuje tablicę i nazwy kolumn zostały utracone. Alternatywnie, czy istnieje znacznie skuteczny sposób na wykonanie powyższej operacji?.

Author: Rkz, 2015-09-04

2 answers

Wygląda na to, że używasz scikit-learn ' s DictVectorizer do konwersji kategorycznych wartości na binarne. W takim przypadku, aby zapisać wynik wraz z nowymi nazwami kolumn, możesz zbudować nową ramkę danych z wartościami z vec_x i kolumnami z DV.get_feature_names(). Następnie przechowuj ramkę danych na dysku (np. z to_csv()) zamiast tablicy numpy.

Alternatywnie, możliwe jest również użycie pandas do wykonania kodowania bezpośrednio z get_dummies funkcja:

import pandas as pd
data = pd.DataFrame({'T': ['A', 'B', 'C', 'D', 'E']})
res = pd.get_dummies(data)
res.to_csv('output.csv')
print res

Wyjście:

   T_A  T_B  T_C  T_D  T_E
0    1    0    0    0    0
1    0    1    0    0    0
2    0    0    1    0    0
3    0    0    0    1    0
4    0    0    0    0    1
 9
Author: YS-L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 02:29:43

Masz na myśli kodowanie "one-hot"?

Powiedz, że masz następujący zbiór danych:

import pandas as pd
df = pd.DataFrame([
            ['green', 1, 10.1, 0], 
            ['red', 2, 13.5, 1], 
            ['blue', 3, 15.3, 0]])

df.columns = ['color', 'size', 'prize', 'class label']
df

Tutaj wpisz opis obrazka

Masz wiele opcji ...

A) Żmudne Podejście

color_mapping = {
           'green': (0,0,1),
           'red': (0,1,0),
           'blue': (1,0,0)}

df['color'] = df['color'].map(color_mapping)
df

Tutaj wpisz opis obrazka

import numpy as np
y = df['class label'].values
X = df.iloc[:, :-1].values
X = np.apply_along_axis(func1d= lambda x: np.array(list(x[0]) + list(x[1:])), axis=1, arr=X)

print('Class labels:', y)
print('\nFeatures:\n', X)

:

Class labels: [0 1 0]

Features:
 [[  0.    0.    1.    1.   10.1]
 [  0.    1.    0.    2.   13.5]
 [  1.    0.    0.    3.   15.3]]

B) Scikit-learn ' s DictVectorizer

from sklearn.feature_extraction import DictVectorizer
dvec = DictVectorizer(sparse=False)

X = dvec.fit_transform(df.transpose().to_dict().values())
X

:

array([[  0. ,   0. ,   1. ,   0. ,  10.1,   1. ],
       [  1. ,   0. ,   0. ,   1. ,  13.5,   2. ],
       [  0. ,   1. ,   0. ,   0. ,  15.3,   3. ]])

C) Pandy " get_dummies

pd.get_dummies(df)

Tutaj wpisz opis obrazka

 14
Author: Sebastian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 02:41:17