2016-07-30 28 views
0

文字列で埋められた列をカテゴリ変数に変換して統計を実行したい。しかし、私はPythonをかなり新しくしているので、この変換には問題があります。ここで列内の文字列をカテゴリ変数に変換する

は私のコードのサンプルです:

# 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) 

しかし、私はこのエラーを取得したい:

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

ec26ad35値は、カテゴリ変数C1C2から文字列です。私は何が起こっているのか分からない:私はすでにカテゴリ変数に文字列を変換していないのですか?なぜ彼らはまだ文字列であると言っているのですか? data.head(30)を使用して

、これが私のデータです:

>> 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 

編集:失われたデータを帰から含まれる誤差のトレーニングとテストデータセットにデータフレームを分割した後。何が起こっているのか分かりません。

+1

変数が何であるか分かりませんが、カテゴリ変数の場合は線形回帰で[ダミー変数](http://stackoverflow.com/a/37144372/2285236)を使う必要があります。 – ayhan

+1

データフレームからサンプルを投稿する場合は、そのためのパンダソリューションも提案できます。 – ayhan

+0

@Ayhanそれは上です。 –

答えて

2

コメントに記載されているように、おそらくdummy variablesを使用します。これは、実際にはテキストラベルに順序があることは、データからはほとんど考えられないからです。

これはpandas.get_dummies、例えば経由で簡単に行うことができます。これは、通常のデータフレームを返すこと

pd.get_dummies(df.C1) 

注:

>>> 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') 

あなたはおそらくそのため、水平concatでこれを使用したいと思います。


あなたが実際に実際に(そうは思えない)数値何かにラベルを変換するために探しているなら、あなたはsklearn.preprocessing.LabelEncoderに見えるかもしれません。

+0

迅速な対応をありがとう! –

+0

私はあなたがコードを読んでいるときは確信していますが、文字列をカテゴリ変数の要素に変更するいくつかの変更を行いました。 –

関連する問題