如何使pandas的read_csv对于不规则分隔符中的空格更加灵活?

119
我需要使用read_csv方法从文件中读取数据来创建一个数据框。然而,分隔符不是很规则:有些列是用制表符(\t)分隔的,其他列是用空格分隔的。此外,有些列可能被2或3或更多个空格分隔,甚至是由空格和制表符组合而成的(例如3个空格、两个制表符,然后1个空格)。
有没有办法告诉pandas正确地处理这些文件?
顺便说一下,如果我使用Python,我就没有这个问题。我使用的是:
for line in file(file_name):
   fld = line.split()

它完美地工作。 它不在乎字段之间是否有2或3个空格。 即使是空格和制表符的组合也不会引起任何问题。 pandas能做到同样的吗?

4个回答

180

文档中可以看到,您可以使用正则表达式或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

6
您可以使用 skipinitialspace 来跳过开头的空格。 - jarondl
当我有一个txt.file,并且格式是数字后跟至少两个空格时,它是如何工作的?公式delimiter=r"\d\d\s\s+不起作用。 - PV8
@PV8:在这种情况下,您的分隔符仍然只是\s+\s{2,}。不要在分隔符中包含字段\d\d的表达式!分隔符只是分隔符!字段是分隔符(或引号)之间的所有内容。 - smci
如何从列表中访问单个元素?如果我像这样做 df = pd.read_csv("whitespace.csv", header=None, delim_whitespace=True),print(df[0]) 只会打印第一个元素0,但如果我执行 print(df[1]) 它不会打印下一个元素,难道它不是一个列表吗? - Sniper
在delimiter=r"\s+"中,'r'是多余的,您可以使用delimiter="\s+"。 - Shevach Riabtsev

21
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

将使用任意数量的空格和制表符作为分隔符。


4
Pandas有两个CSV阅读器,其中只有一个对于多余的前导空格很灵活:
pd.read_csv("whitespace.csv", skipinitialspace=True)

当一个条件不被满足时

pd.DataFrame.from_csv("whitespace.csv")

关于末尾空格,两者都不支持开箱即用,需要使用正则表达式来解决。避免使用delim_whitespace,因为它也允许只有空格(而没有逗号或制表符)作为分隔符。


2
我们可以考虑这样做来处理所有的组合和零个或多个出现。
pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接