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


76

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

有没有办法告诉熊猫正确对待这些文件?

顺便说一句,如果我使用Python,则不会出现此问题。我用:

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

而且效果很好。不管字段之间是否有2或3个空格。即使空格和制表符的组合也不会引起任何问题。熊猫可以做同样的事情吗?

Answers:


130

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

4
您还可以使用skipinitialspace跳过初始空间
jarondl 2014年

当我有一个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,但如果我打印,则不打印下一个元素df [1])是不是列表?
Sniper

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

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


3

熊猫有两个csv读取器,仅在冗余的前导空白方面很灵活:

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

虽然不是

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

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


2

我们可能会考虑所有组合以及零次或多次出现。

pd.read_csv("whitespace.csv", header = None, sep = "[ \t]*,[ \t]*")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.