97

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

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

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

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

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

4

4 回答 4

150

文档中,您可以使用正则表达式或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
于 2013-02-22T14:51:51.297 回答
14
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

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

于 2016-12-25T11:32:28.703 回答
4

Pandas 有两个 csv 阅读器,仅在冗余前导空白方面灵活:

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

而一个不是

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

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

于 2017-11-04T14:37:08.157 回答
2

我们可以认为这是处理所有组合以及零次或多次出现的情况。

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")
于 2017-10-27T04:26:58.690 回答