如何让pandas的read_csv在处理不规则分隔符时对空格更灵活?

121 投票
4 回答
133515 浏览
提问于 2025-04-17 16:46

我需要通过读取一个文件来创建一个数据框,使用的是 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

撰写回答