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

Posted

技术标签:

【中文标题】对于不规则的分隔符,如何使 pandas read_csv 中的分隔符更灵活 wrt 空格?【英文标题】:How to make separator in pandas read_csv more flexible wrt whitespace, for irregular separators? 【发布时间】:2013-02-08 05:16:08 【问题描述】:

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

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

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

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

而且效果很好。它不关心字段之间是否有 2 个或 3 个空格。即使是空格和制表符的组合也不会造成任何问题。大熊猫也能做到吗?

【问题讨论】:

【参考方案1】:

从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

【讨论】:

也可以使用skipinitialspace跳过初始空格 当我有一个txt.file 并且我有一个数字后跟至少两个空格的格式时,它是如何工作的?公式delimiter=r"\d\d\s\s+不起作用 @PV8: 在这种情况下,您的分隔符仍然只有 \s+\s2, 。不要在分隔符中包含字段 \d\d 的表达式!分隔符只是分隔符!字段是分隔符(或引号)之间的所有内容。 如何访问列表中的单个元素?如果我喜欢这个 df = pd.read_csv("whitespace.csv", header=None, delim_whitespace=True), print(df[0]) 只打印第一个元素 0 但如果我打印它不会打印下一个元素( df[1]) 不是列表吗?【参考方案2】:

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

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

虽然不是

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:
>>> pd.read_csv("whitespace.csv", header = None, sep = "\s+|\t+|\s+\t+|\t+\s+")

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

【讨论】:

以上是关于对于不规则的分隔符,如何使 pandas read_csv 中的分隔符更灵活 wrt 空格?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas.read_csv:需要反斜杠分隔符?

如何使用 pandas.read_csv 在双引号之间读取带有千位分隔符的数字 [重复]

如何使 pandas.read_sql() 不将所有标题转换为小写

pandas中分隔符由多个字符组成

pandas.read_csv 不在分号分隔符处对数据进行分区

python pandas 中文件的读写——read_csv()读取文件