2016-07-30 14 views
0

Ich möchte Spalten mit Strings in kategorische Variablen transformieren, so dass ich Statistiken ausführen konnte. Allerdings habe ich Schwierigkeiten mit dieser Transformation, weil ich Python ziemlich neu bin. HierStrings in Spalte in kategoriale Variable konvertieren

ist eine Probe von meinem Code:

# Open txt file and provide column names 
data = pd.read_csv('sample.txt', sep="\t", header = None, 
        names = ["Label", "I1", "I2", "C1", "C2"]) 
# Convert I1 and I2 to continuous, numeric variables 
data = data.apply(lambda x: pd.to_numeric(x, errors='ignore')) 
# Convert Label, C1, and C2 to categorical variables 
data["Label"] = pd.factorize(data.Label)[0] 
data["C1"] = pd.factorize(data.C1)[0] 
data["C2"] = pd.factorize(data.C2)[0] 

# Split the predictors into training/testing sets 
predictors = data.drop('Label', 1) 
msk = np.random.rand(len(predictors)) < 0.8 
predictors_train = predictors[msk] 
predictors_test = predictors[~msk] 

# Split the response variable into training/testing sets 
response = data['Label'] 
ksm = np.random.rand(len(response)) < 0.8 
response_train = response[ksm] 
response_test = response[~ksm] 

# Logistic Regression 
from sklearn import linear_model 
# Create logistic regression object 
lr = linear_model.LogisticRegression() 

# Train the model using the training sets 
lr.fit(predictors_train, response_train) 

Allerdings würde ich diesen Fehler:

ValueError: could not convert string to float: 'ec26ad35' 

Der ec26ad35 Wert ist eine Zeichenfolge aus den kategorischen Variablen C1 und C2. Ich bin mir nicht sicher, was passiert: Habe ich die Strings nicht schon in kategoriale Variablen umgewandelt? Warum sagt der Fehler, dass sie immer noch Zeichenfolgen sind?

data.head(30) Verwendung, das ist meine Daten:

>> data[["Label", "I1", "I2", "C1", "C2"]].head(30) 
    Label I1 I2  C1  C2 
0  0 1.0 1 68fd1e64 80e26c9b 
1  0 2.0 0 68fd1e64 f0cf0024 
2  0 2.0 0 287e684f 0a519c5c 
3  0 NaN 893 68fd1e64 2c16a946 
4  0 3.0 -1 8cf07265 ae46a29d 
5  0 NaN -1 05db9164 6c9c9cf3 
6  0 NaN 1 439a44a4 ad4527a2 
7  1 1.0 4 68fd1e64 2c16a946 
8  0 NaN 44 05db9164 d833535f 
9  0 NaN 35 05db9164 510b40a5 
10  0 NaN 2 05db9164 0468d672 
11  0 0.0 6 05db9164 9b5fd12f 
12  1 0.0 -1 241546e0 38a947a1 
13  1 NaN 2 be589b51 287130e0 
14  0 0.0 51 5a9ed9b0 80e26c9b 
15  0 NaN 2 05db9164 bc6e3dc1 
16  1 1.0 987 68fd1e64 38d50e09 
17  0 0.0 1 8cf07265 7cd19acc 
18  0 0.0 24 05db9164 f0cf0024 
19  0 7.0 102 3c9d8785 b0660259 
20  1 NaN 47 1464facd 38a947a1 
21  0 0.0 1 05db9164 09e68b86 
22  0 NaN 0 05db9164 38a947a1 
23  0 NaN 9 05db9164 08d6d899 
24  0 0.0 1 5a9ed9b0 3df44d94 
25  0 NaN 4 5a9ed9b0 09e68b86 
26  1 0.0 1 8cf07265 942f9a8d 
27  1 0.0 20 68fd1e64 38a947a1 
28  1 0.0 78 68fd1e64 1287a654 
29  1 3.0 0 05db9164 90081f33 

bearbeiten: Inklusiv Fehler von fehlenden Daten und rechnete nach Datenrahmen in Trainings- und Testdatensätze zu splitten. Nicht sicher, was hier auch vorgeht.

# Impute missing data 
>> from sklearn.preprocessing import Imputer 
>> imp = Imputer(missing_values='NaN', strategy='mean', axis=0) 
>> predictors_train = imp.fit_transform(predictors_train) 
TypeError: float() argument must be a string or a number, not 'function' 
+1

Ich weiß nicht, was diese Variable ist, aber für kategorische Variablen müssen Sie [Dummy-Variablen] verwenden (http://stackoverflow.com/a/37144372/2285236) in der linearen Regression. – ayhan

+1

Wenn Sie ein Beispiel aus Ihrem Datenrahmen posten, kann ich Ihnen auch eine Pandas-Lösung empfehlen. – ayhan

+0

@Ayhan Es ist auf. –

Antwort

2

Wie @ayhan in den Kommentaren erwähnt, möchten Sie wahrscheinlich dummy variables hier verwenden. Dies liegt daran, dass es aus Ihren Daten höchst unwahrscheinlich erscheint, dass in Ihren Textbeschriftungen wirklich etwas angeordnet ist.

Dies kann leicht über pandas.get_dummies erfolgen, zB:

pd.get_dummies(df.C1) 

Beachten Sie, dass dies eine regelmäßige Datenrahmen zurück:

>>> pd.get_dummies(df.C1).columns 
Index([u'05db9164', u'1464facd', u'241546e0', u'287e684f', u'3c9d8785', 
    u'439a44a4', u'5a9ed9b0', u'68fd1e64', u'8cf07265', u'be589b51'], 
    dtype='object') 

Sie wahrscheinlich diese mit einem horizontalen concat verwenden wollen würde, deshalb .


Wenn Sie tatsächlich eigentlich suchen, um die Etiketten in etwas numeric (das scheint nicht wahrscheinlich) zu transformieren, Sie bei sklearn.preprocessing.LabelEncoder aussehen könnte.

+0

Danke für die schnelle Antwort! –

+0

Ich bin unsicher, wenn Sie den Code, aber ich machte einige Änderungen, die die Zeichenfolgen in Faktoren in einer kategorialen Variable ändern würde. –