web-dev-qa-db-ja.com

最初の列なしでCSVを読み取る方法

私は以下のような簡単なCSVファイルを読み、その内容を2D配列に入れようとしています:

"","x","y","sim1","sim2","sim3","sim4","sim5","sim6","sim7","sim8","sim9","sim10","sim11","sim12"
"1",181180,333740,5.56588745117188,6.29487752914429,7.4835410118103,5.75873327255249,6.62183284759521,5.81478500366211,4.85671949386597,5.90418815612793,6.32611751556396,6.99649047851562,6.52076387405396,5.68944215774536
"2",181140,333700,6.36264753341675,6.5217604637146,6.16843748092651,5.55328798294067,7.00429201126099,6.43625402450562,6.17744159698486,6.72836923599243,6.38574266433716,6.81451606750488,6.68060827255249,6.14339065551758
"3",181180,333700,6.16541910171509,6.44704437255859,7.51744651794434,5.46270132064819,6.8890323638916,6.46842670440674,6.07698059082031,6.2140531539917,6.43774271011353,6.21923875808716,6.43355655670166,5.90692138671875

これを行うには、これを使用します。

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)

しかし、私は常にこのメッセージを受け取りました:

"ValueError: could not convert string to float: "1"

問題は各行の最初の列にあると思いました。だから、最初のコラムなしでそれを読んでみましたが、どうすればよいかわかりませんでした。

だから、どうすれば最初の列を無視できますか?最初の列でこのファイルを読み取る方法はありますか?

23
pceccon

任意の列にコンバーターを指定できます。

converters = {0: lambda s: float(s.strip('"')}
data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, converters=converters)

または、次のように、使用する列を指定できます。

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,15))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html


列の数を知らずに最初の列をスキップできる1つの方法は、csvから列の数を手動で読み取ることです。書式設定の不整合を考慮するために時々これを微調整する必要があるかもしれませんが、それは十分簡単です*。

with open("Data/sim.csv") as f:
    ncols = len(f.readline().split(','))

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1, usecols=range(1,ncols+1))

*上部に空白行がある場合は、それらをスキップする必要があります。フィールドヘッダーにカンマがある場合は、代わりに最初のデータ行を使用して列をカウントする必要があります。したがって、特定の問題がある場合は、コードをより堅牢にするためにいくつかの詳細を追加できます。

27
jmilloy

pandasを使用して、それをDataFrameオブジェクトとして読み取ることができます。不要な列がわかっている場合は、ロードする行に.dropを追加するだけです。

a = pandas.read_csv("Data/sim.csv",sep=",").drop(a.columns[0], axis=1)

最初の行はヘッダーとして読み取られますが、read_csvパラメーターにskiprows = 1を追加できます。 Pandas DataFramesはnumpy配列であるため、列または行列をnumpy配列に変換するのは非常に簡単です。

11
Deninhos

jmilloyとDeninhosの答えは両方とも良いです。 OPがNumPy配列(pandasデータフレーム)とは対照的に)を読みたい場合、もう1つの単純な代替方法は、読み取り後にインデックス列を削除することです。これは、インデックス列が常に最初ですが、機能(列)の数は柔軟です。

data = np.loadtxt("Data/sim.csv", delimiter=',', skiprows=1)
data = np.delete(data, 0, axis = 1)
0
oustella

Csvライブラリを使用してcsvファイルを読み取ってみる

import csv

def someFunc(fname):
    with open(fname) as f:
    reader = csv.reader(f)

    i = 0
    header = True
    for row in reader:
        if header:
            header = False
            continue

        out[i] = [row[j] for j in range(len(columns))]
        i += 1
return out

outは2D配列を持ちます。

0
Karthik