はい、問題を再現できましたが、 で修正する方法がわかりませんpd.read_csv
。回避策は次のとおりです。
In [46]: import numpy as np
In [47]: arr = np.genfromtxt('test3.csv', delimiter = ',',
dtype = None, names = True)
In [48]: df = pd.DataFrame(arr)
In [49]: df
Out[49]:
x y
0 Reg
1 Reg
2 I Swp
3 I Swp
csv の最初の有効な行は列名として解釈されることに注意してくださいnames = True
(したがって、後続の行の値の dtype には影響しません)。したがって、csv ファイルに次のような数値データが含まれている場合
In [22]: with open('/tmp/test.csv','r') as f:
....: print(repr(f.read()))
....:
'x,y,z\n \x00\x00\x00,Reg,1\n \x00\x00\x00,Reg,2\nI,Swp,3\nI,Swp,4\n'
次に、genfromtxt は数値の dtype を 3 番目の列 (<i4
この場合) に割り当てます。
In [19]: arr = np.genfromtxt('/tmp/test.csv', delimiter = ',', dtype = None, names = True)
In [20]: arr
Out[20]:
array([('', 'Reg', 1), ('', 'Reg', 2), ('I', 'Swp', 3), ('I', 'Swp', 4)],
dtype=[('x', '|S3'), ('y', '|S3'), ('z', '<i4')])
ただし、数値データが次のようなバイトと混在している場合、'\x00'
genfromtxt はこの列を数値として認識できないため、文字列 dtype の割り当てに頼ります。それでも、dtype
パラメーターを手動で割り当てることにより、列の dtype を強制できます。例えば、
In [11]: arr = np.genfromtxt('/tmp/test.csv', delimiter = ',', dtype = [('x', '|i4'), ('y', '|S3')], names = True)
最初の列x
に dtype |i4
(4 バイトの整数) を設定し、2 番目の列y
に dtype |S3
(3 バイトの文字列) を設定します。利用可能な dtype の詳細については、このドキュメント ページを参照してください。