如何让pandas的read_csv在处理不规则分隔符时对空格更灵活?
我需要通过读取一个文件来创建一个数据框,使用的是 read_csv
方法。不过,这个文件里的数据分隔符不太规则:有的列是用制表符(\t
)分开的,有的则是用空格分开的。而且,有些列之间可能用2个、3个甚至更多的空格分开,或者是空格和制表符的组合(比如3个空格、两个制表符再加1个空格)。
有没有办法让pandas正确处理这些文件呢?
顺便说一下,如果我用Python的话就没有这个问题。我使用的是:
for line in file(file_name):
fld = line.split()
这样做效果很好。它不在乎字段之间有2个还是3个空格。即使是空格和制表符的组合也不会造成任何问题。pandas能做到这一点吗?
4 个回答
4
Pandas有两个读取csv文件的工具,其中一个在处理多余的前导空格时比较灵活:
pd.read_csv("whitespace.csv", skipinitialspace=True)
而另一个就不那么灵活了
pd.DataFrame.from_csv("whitespace.csv")
不过这两个工具在处理结尾的空格时都不够灵活,具体可以看看使用正则表达式的答案。尽量避免使用delim_whitespace,因为它也允许仅用空格(没有逗号或\t)作为分隔符。
21
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")
可以使用任意数量的空格和制表符的组合作为分隔符。
184
根据文档,你可以使用正则表达式或者delim_whitespace
来处理数据:
>>> import pandas as pd
>>> for line in open("whitespace.csv"):
... print repr(line)
...
'a\t b\tc 1 2\n'
'd\t e\tf 3 4\n'
>>> pd.read_csv("whitespace.csv", header=None, delimiter=r"\s+")
0 1 2 3 4
0 a b c 1 2
1 d e f 3 4
>>> pd.read_csv("whitespace.csv", header=None, delim_whitespace=True)
0 1 2 3 4
0 a b c 1 2
1 d e f 3 4