web-dev-qa-db-ja.com

Python Pandasはcsvファイルの最初の行を読み取りません

pandasモジュールのCSV(またはtxtファイル)の読み取りに問題があります。numpyのloadtxt関数には時間がかかりすぎるため、代わりにpandas read_csvを使用することにしました。

スペースで区切られた4つの列を持つtxtファイルからnumpy配列を作成し、非常に多数の行(256 ^ 3など。この例では64 ^ 3)を作成します。

問題は、理由がわからないことですが、pandasのread_csvは常にcsv(txt)ファイルの最初の行(最初の行)をスキップするため、データが1つ少なくなります。

ここにコードがあります。

from __future__ import division
import numpy as np
import pandas as pd
ngridx = 4
ngridy = 4
ngridz = 4
size = ngridx*ngridy*ngridz
f = np.zeros((size,4))
a = np.arange(size)
f[:, 0] = np.floor_divide(a, ngridy*ngridz)
f[:, 1] = np.fmod(np.floor_divide(a, ngridz), ngridy)
f[:, 2] = np.fmod(a, ngridz)
f[:, 3] = np.random.Rand(size)
print f[0]
np.savetxt('Testarray.txt',f,fmt='%6.16f')
g = pd.read_csv('Testarray.txt',delimiter=' ').values
print g[0]
print len(g[:,3])

出力に表示されるf [0]とg [0]は一致する必要がありますが、一致しないため、pandasはTestarray.txtの最初の行をスキップします。また、読み込まれたファイルの長さgは、配列fの長さよりも短くなります。

私は助けが必要です。

前もって感謝します。

18
Tom

デフォルトでは、pd.read_csvheader=0を使用します(namesパラメーターも指定されていない場合)。つまり、最初(つまり0番目のインデックス)の行は列名として解釈されます。

データにヘッダーがない場合は、使用します

pd.read_csv(..., header=None)

例えば、

import io
import sys
import pandas as pd
if sys.version_info.major == 3:
    # Python3
    StringIO = io.StringIO 
else:
    # Python2
    StringIO = io.BytesIO

text = '''\
1 2 3
4 5 6
'''

print(pd.read_csv(StringIO(text), sep=' '))

headerがなければ、最初の行1 2 3は列名を設定します:

   1  2  3
0  4  5  6

header=Noneを使用すると、最初の行はデータとして扱われます。

print(pd.read_csv(StringIO(text), sep=' ', header=None))

プリント

   0  1  2
0  1  2  3
1  4  5  6
40
unutbu

ファイルにヘッダー行がない場合は、Pandasであるため、pd.read_csv()への呼び出しでheader = Noneを使用する必要があります。

1
RustProof Labs