2013-02-22 94 views
34

我需要使用存储在文件中的数据创建数据框。为此,我想使用read_csv方法。但是,分隔符不是很规则。某些列由制表符分隔(\t),其他用空格分隔。此外,某些列可以由2或3或更多空格分隔,甚至可以由空格和制表符组合(例如3个空格,两个制表符和1个空格)。如何使read_csv中的分隔符更加灵活wrt空格?

有没有办法让大熊猫正确处理这些文件?

顺便说一句,如果我使用Python,我没有这个问题。我用:

for line in file(file_name): 
    fld = line.split() 

它的作品完美。它不关心字段之间是否有2或3个空格。即使是空格和制表符的组合也不会导致任何问题。熊猫可以做同样的事吗?

回答

58

documentation,您可以使用正则表达式或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 
+1

你也可以使用'skipinitialspace'跳过初始空间 – jarondl 2014-12-04 14:28:00

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

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

0

我们可能会考虑这样做,以处理所有的组合,零次或多次发生。

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*") 
0

熊猫有两个CSV读者,不仅是灵活的关于冗余前导空格:

pd.read_csv("whitespace.csv", skipinitialspace=True) 

而一个不

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

也不是乱开箱灵活关于末尾的空格,请使用正则表达式查看答案。避免delim_whitespace,因为它也允许空格(没有或\ t)作为分隔符。

相关问题