从csv

时间:2015-08-13 18:54:32

标签: python csv pandas null python-3.3

我正在使用Python 3.3.5和pandas 0.16.2。 当尝试从csv读取文件时,当空字符(00)位于第一列中的数据末尾时,它将两列组合在一起。

所以数据是这样的4列:

"LANE_1<NUL>","17","21.8","68.3"

其中&lt; NUL&GT;是一个空字符,或十六进制00.它采用前两个逗号分隔的项目并将它们放入一个结果

LANE_1',17' | 21.8 | 68.3

制作3列而不是4列应该是

LANE_1 | 17 | 21.8 | 68.3

就像大熊猫不知道第一个逗号一样。有没有办法解决这个问题,而无需去修改所有.csv文件来删除空字符? Excel似乎打开文件就好了分开前两列。

2 个答案:

答案 0 :(得分:1)

如果NUL不是数据中不可或缺的一部分,而是神器/噪音,我宁愿将其清理干净。否则,您在处理数据时可能会遇到麻烦。

答案 1 :(得分:1)

如果您知道null只会出现在分隔符上,您只需使用正则表达式分隔符:

In [43]: s
Out[43]: 'a\x00,b,c\nd\x00,e,f'

In [44]: print s
a,b,c
d,e,f

In [45]: pd.read_csv(StringIO.StringIO(s))
Out[45]: 
   a,b  c
0  d,e  f

In [46]: pd.read_csv(StringIO.StringIO(s), sep="\x00?,", engine="python")
Out[46]: 
   a  b  c
0  d  e  f

编辑:

正如你所指出的,引用有点奇怪。另一个建议数据清理的答案实际上可能会更好,但你可以用一些不那么漂亮的技巧来解决它:

In [109]: s = '"a\x00","b","c"\n"d\x00","e","f"'

In [110]: pd.read_csv(StringIO.StringIO(s), sep='\x00?,', engine="python")
Out[110]: 
   "a"  "b"  "c"
0  "d"  "e"  "f"

In [111]: pd.read_csv(StringIO.StringIO(s), sep='\x00?,',
converters={c: lambda x: x.strip('\x00"') for c in xrange(3)}, engine="python")
Out[111]: 
  "a" "b" "c"
0    d   e   f

In [112]: df = pd.read_csv(StringIO.StringIO(s), sep='\x00?,',
converters={c: lambda x: x.strip('\x00"') for c in xrange(3)}, engine="python")

In [113]: df.columns = [c.strip('\x00"') for c in df.columns]

In [114]: df
Out[114]: 
   a  b  c
0  d  e  f