Python 熊猫读取\u csv在包含空字符的列上失败
下面的y列应为['Reg'、'Reg'、'Swp'、'Swp']Python 熊猫读取\u csv在包含空字符的列上失败,python,pandas,Python,Pandas,下面的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
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'
是的,我可以重现这个问题,但不知道如何用
pd.read\u 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
请注意,使用
names=True
时,csv的第一个有效行被解释为列名(因此不会影响后续行上值的数据类型)。因此,如果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将为第三列指定一个数字数据类型(
请显示f=open('/tmp/test3.csv','rb');打印(repr(f.read()))
Updated question以显示发布为的数据。在Windows上使用空值和0.18解决了这个问题。在更新到0.19.1后,所有的工作都没有问题。实际上,是为了纠正我自己。它可以工作,但不是完全正确。在0.19.1中,列保持正确,但单元格中具有空值的文本在空值后会被修剪。@user1827356:Y是的,我的错误。由于忽略提供names=True
,genfromtext
将csv的第一行作为数据而不是列名读取。由于第一行包含字符串,因此数据类型被设置为字符串,尽管后续行包含数字数据。我已更新了我的答案,以显示names=True
和/或dtype
可用于将列设置为适当的类型。
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')])
In [11]: arr = np.genfromtxt('/tmp/test.csv', delimiter = ',', dtype = [('x', '|i4'), ('y', '|S3')], names = True)