Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫读取\u csv在包含空字符的列上失败_Python_Pandas - Fatal编程技术网

Python 熊猫读取\u csv在包含空字符的列上失败

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

下面的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'

是的,我可以重现这个问题,但不知道如何用
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)