いくつかの方法がありますが、いくつかは他の方法よりもきれいです。
通常、numpyでは、文字列データを別の配列に保持します。
(物事はRのデータフレーム、たとえば、よりも少し低いレベルです。あなたは、一般的にちょうど関連のクラスで物事を包むが、異なるデータ型が分離しておく。)
正直なところ、numpyのISNこのような「柔軟性のある」データ型を扱うように最適化されています(確かに可能ですが)。 pandas
のようなものは、 "スプレッドシートのような"データのためのより良いインターフェースを提供します(そして、パンダはnumpyの上の単なるレイヤーです)。
しかし、構造化配列(これはあなたのものです)は、フィールド名のリストを渡すときに列方向にスライスすることができます。しかし、これは理想からかけ離れている
import numpy as np
data = np.recfromcsv('iris.csv')
# In this case, it's just all but the last, but we could be more general
# This must be a list and not a tuple, though.
float_fields = list(data.dtype.names[:-1])
float_dat = data[float_fields]
# Now we just need to view it as a "regular" 2D array...
float_dat = float_dat.view(np.float).reshape((data.size, -1))
# And we can normalize columns as usual.
normalized = (float_dat - float_dat.min(axis=0))/float_dat.ptp(axis=0)
:(例えばdata[['col1', 'col2', 'col3']]
)
いずれにしても、一つの方法は、このような何かを行うことです。インプレースで(現在のように)操作を実行したい場合、最も簡単な解決策は、既に持っているものです。フィールド名を繰り返し処理するだけです。
import pandas
data = pandas.read_csv('iris.csv', header=None)
float_dat = data[data.columns[:-1]]
dmin, dmax = float_dat.min(axis=0), float_dat.max(axis=0)
data[data.columns[:-1]] = (float_dat - dmin)/(dmax - dmin)
+1ありがとうございました。これは非常に有益で洞察に満ちた答えです。データセットを数値列と非数値列に分割するのは、おそらく道のりです。これにより、他の多くの操作が明確に定義され、実際には何をしようとしていたのでしょうか。私は 'data [list]'を使って複数の列を選択するオプションを知らなかった。 –