如何在pandas中创建分隔符read_csv更灵活wrt whitespace?

时间:2013-02-22 14:43:51

标签: python csv pandas dataframe whitespace

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

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

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

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

它完美无缺。它不关心字段之间是否有2或3个空格。即使空格和制表符的组合也不会造成任何问题。大熊猫可以这样做吗?

4 个答案:

答案 0 :(得分:84)

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 :(得分:8)

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

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

答案 2 :(得分:0)

我们可能会考虑这一点来处理所有组合以及零次或多次出现。

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

答案 3 :(得分:0)

Pandas有两个csv阅读器,只有关于冗余前导空格的灵活性:

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

而一个不是

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

对于尾随空白区域,这两者都不具备开箱即用的灵活性,请参阅正则表达式的答案。避免使用delim_whitespace,因为它也只允许空格(不带或\ t)作为分隔符。