下面的列y应该是['Reg','Reg','Swp','Swp']
In [1]: pd.read_csv('/tmp/test3.csv')
Out[1]:
x,y
^@^@^@,Reg
^@^@^@,Reg
I,Swp
I,Swp
In [2]: ! cat /tmp/test3.csv
x y
0
1 NaN NaN
2 I Swp
3 I Swp
In [3]: f = open('/tmp/test3.csv', 'rb'); print(repr(f.read()))
'x,y\n \x00\x00\x00,Reg\n \x00\x00\x00,Reg\nI,Swp\nI,Swp\n'
Run Code Online (Sandbox Code Playgroud)
是的,我可以重现这个问题,但不知道如何修复它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
Run Code Online (Sandbox Code Playgroud)
请注意,names = True
csv的第一个有效行被解释为列名(因此不会影响后续行上的值的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'
Run Code Online (Sandbox Code Playgroud)
然后genfromtxt将数字dtype分配给第三列(<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')])
Run Code Online (Sandbox Code Playgroud)
但是,如果数字数据与字节混合,'\x00'
那么genfromtxt将无法将此列识别为数字,因此将使用分配字符串dtype.不过,您可以通过手动分配dtype
参数来强制列的dtype .例如,
In [11]: arr = np.genfromtxt('/tmp/test.csv', delimiter = ',', dtype = [('x', '|i4'), ('y', '|S3')], names = True)
Run Code Online (Sandbox Code Playgroud)
将第一列设置x
为具有dtype |i4
(4字节整数),将第二列设置y
为具有dtype |S3
(3字节字符串).有关可用dtypes的更多信息,请参阅此文档页面.
归档时间: |
|
查看次数: |
2411 次 |
最近记录: |