如何在 pandas.read_csv 的标题之前跳过未知数量的空行?

Posted

技术标签:

【中文标题】如何在 pandas.read_csv 的标题之前跳过未知数量的空行?【英文标题】:How to skip an unknown number of empty lines before header on pandas.read_csv? 【发布时间】:2017-01-10 21:26:26 【问题描述】:

我想从标题不在第一行的 csv 文件中读取数据帧。例如:

In [1]: import pandas as pd

In [2]: import io

In [3]: temp=u"""#Comment 1
   ...: #Comment 2
   ...: 
   ...: #The previous line is empty
   ...: Header1|Header2|Header3
   ...: 1|2|3
   ...: 4|5|6
   ...: 7|8|9"""

In [4]: df = pd.read_csv(io.StringIO(temp), sep="|", comment="#", 
   ...:                  skiprows=4).dropna()

In [5]: df
Out[5]: 
   Header1  Header2  Header3
0        1        2        3
1        4        5        6
2        7        8        9

[3 rows x 3 columns]

上面代码的问题是我现在不知道在标题之前会有多少行,因此我不能像这里那样使用skiprows=4

我知道我可以遍历文件,就像问题 Read pandas dataframe from csv beginning with non-fix header 中一样。

我正在寻找一个更简单的解决方案,例如让pandas.read_csv 忽略任何空行并将第一个非空行作为标题。

【问题讨论】:

抱歉,pd.read_csv(io.StringIO(temp), sep="|", comment="#") 不起作用? 不,注释行被翻译成空行,不会被忽略。 会不会是版本问题? skip_blank_lines=True 是 0.18.1 中的默认值。 当我使用pd.read_csv(io.StringIO(temp), sep="|", comment="#") 运行您的示例时,它的工作方式与您在所需输出中描述的完全一样。 【参考方案1】:

你需要设置skip_blank_lines=True

df = pd.read_csv(io.StringIO(temp), sep="|", comment="#", skip_blank_lines=True).dropna()

【讨论】:

谢谢。我怀疑应该存在这样的选项,甚至检查 read_csv 帮助。我没有找到,因为我使用的是 pandas 0.13。我会努力更新的。

以上是关于如何在 pandas.read_csv 的标题之前跳过未知数量的空行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?

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

如何使用 pandas.read_csv() 将索引数据读取为字符串?

在 Pandas read_csv 期间标记数据时出错。如何真正看到坏线?

如何使用带有 gzip 压缩选项的 pandas read_csv 读取 tar.gz 文件?