【问题标题】:Pandas read_csv() conditionally skipping header rowPandas read_csv() 有条件地跳过标题行
【发布时间】:2018-12-12 08:49:39
【问题描述】:

我正在尝试读取 csv 文件,但我的 csv 文件不同。有些有不同的格式,有些有其他的。我正在尝试添加控件,这样我就不需要编辑我的代码或我的输入文件。

我的问题是,其中一些 csv 文件在列标题上方有一行字符串。一个例子:

Created on 12-11-2018,CryptoDataDownload.com
Date,Symbol,Open,High,Low,Close,Volume From,Volume To
2018-12-11 11-AM,ADABTC,8.6e-06,8.61e-06,8.55e-06,8.57e-06,301141.7,2.59
2018-12-11 10-AM,ADABTC,8.69e-06,8.72e-06,8.6e-06,8.6e-06,236949.63,2.05

如果我导入它,分隔符将使用第一行并将文件分成两列,分别为 Created on 12-11-2018 和 CryptoDataDownload.com。

这就是df.head() 的样子:

                        Created on 12-11-2018 CryptoDataDownload.com
Date             Symbol Open     High     Low      Close              Volume From                          Volume To
2018-12-11 11-AM ADABTC 8.6e-06  8.61e-06 8.55e-06 8.57e-06              301141.7                               2.59
2018-12-11 10-AM ADABTC 8.69e-06 8.72e-06 8.6e-06  8.6e-06              236949.63                               2.05
2018-12-11 09-AM ADABTC 8.7e-06  8.7e-06  8.62e-06 8.69e-06             509311.39                               4.41
2018-12-11 08-AM ADABTC 8.69e-06 8.7e-06  8.63e-06 8.7e-06              111367.34                             0.9656

我想检查这个文件是否有这一行,如果有就跳过它。

我该怎么做?

【问题讨论】:

  • 那么,您是否尝试将skiprows=1 添加到read_csv?
  • @coldspeed 并非我所有的文件都有这一行,所以我需要先检查这一行是否存在。否则,我将删除我的列标题
  • 您的所有数据帧是否都具有相同的标头,或者可能不同?是否有与这些标头关联的模式(例如,“created on...”)?
  • 标题也不同,但我在导入后将它们编辑为相同
  • 我建议将中断移动到一个缩进级别,因为您似乎只需要检查第一行。

标签: python pandas csv


【解决方案1】:

如果您的 CSV 文件中的标题遵循类似的模式,您可以执行一些简单的操作,例如在确定是否跳过第一行之前先嗅探第一行。

filename = '/path/to/file.csv'
skiprows = int('Created in' in next(open(filename)))
df = pd.read_csv(filename, skiprows=skiprows)

最好的做法是使用上下文管理器,因此您也可以这样做:

filename = '/path/to/file.csv'
skiprows = 0
with open(filename, 'r+') as f:
    for line in f:
        if line.startswith('Created '):
            skiprows = 1
        break
df = pd.read_csv(filename, skiprows=skiprows)

【讨论】:

  • 给我TypeError: 'numpy.ndarray' object is not callable 错误。这是 next(f) 0 索引吗?
  • @iso_9001_ 这是我的代码中遇到的一个奇怪的错误。你能找出错误吗?随意编辑我的答案。谢谢!
  • 您可能在编辑时删除了我的工作代码。我认为您的代码不起作用,因为startswith 函数返回true 或false,而不是索引。
【解决方案2】:

在 pandas read_csv 命令中使用 'comment' 参数时,您可以跳过以特定字符开头的行。在您的情况下,您可以使用以下代码跳过以“C”开头的行:

filename = '/path/to/file.csv'
pd.read_csv(filename, comment = "C")

【讨论】:

  • 无法正常工作。我在该行之后有 8 列,但这会创建 5 列的 df,因为列名以“C”(关闭)开头。
  • AFAIK comment 参数必须是单个字符,所以整个单词都不起作用。
猜你喜欢
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多