我正在使用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似乎打开文件就好了分开前两列。
答案 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