Pandas read_csv在包含空字符的列上失败

2024-04-29 19:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: csvinreadopennanregouttmp
1条回答
网友
1楼 · 发布于 2024-04-29 19:34:36

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

注意,使用names = True时,csv的第一个有效行被解释为列名(因此不会影响后续行中值的数据类型)

^{2}$

然后genfromtxt将为第三列分配一个数字数据类型(在本例中是<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将无法将此列识别为数值,因此将求助于指定一个字符串数据类型。{5>不过,您可以手动分配dtype的列。例如

In [11]: arr = np.genfromtxt('/tmp/test.csv', delimiter = ',', dtype = [('x', '|i4'), ('y', '|S3')], names = True)

将第一列x设置为数据类型|i4(4字节整数),第二列y具有数据类型|S3(3字节字符串)。有关可用数据类型的详细信息,请参见this doc page。在

相关问题 更多 >