2017-09-07 13 views
0

私はいくつかの列を持つcsvファイルを持っています。文字列のデータフレーム列をリストに変換する

列の一つは、「{0,4,5}」

これらは、空間内の点の座標である形式の文字列です。

私はその列を取り、それらすべての点でkmeansを実行したいと思います。

達成したいのは形状(500,3)(ポイント数、ポイントを定義するフィーチャ)のnp.arrayであり、それは私が達成したいことですkmeansに渡す。

しかし、私は失敗します。

df = pd.read_csv(filename, header=None, names=['a', 'b', 'c'], delimiter=',', 
           converters={'b': lambda x : np.array(list(map(float, x[1:-1].split(',')))) }) 

df.drop('a', axis=1, inplace=True) 
df.drop('c', axis=1, inplace=True) 

X = df['b'].values 


km = KMeans(init='k-means++', n_clusters=5, n_init=10) 
km.fit(X) # here it fails with "ValueError: setting an array element with a sequence." 


X.shape gives (500,) # I would expect it to be 500, 3 
X[0].shape gives (3,) 

print(np.unique(list(map(len, X)))) gives [3] so all the entries have three points 
+0

あなたの質問が十分に解決された場合は、最も有益な回答を[受け入れる](https://stackoverflow.com/help/someone-answers)することができます。 –

答えて

0

使用df.apply、リストにこれらの文字列値を変換し、リストのリストを取得します。

import json 
X = df['b'].str.replace({'{' : '[', '}' : ']'}).apply(json.loads).values.tolist() 

オプションでは、numpyのアレイとobverveに変換:

print(np.array(X).shape) 
(500, 3) 

KMeansがリストでうまく動作することができます、しかし変換する必要はありません。

関連する問題