【问题标题】:How to detect and remove lines above data set while reading from csv?从csv读取时如何检测和删除数据集上方的行?
【发布时间】:2018-09-17 15:51:42
【问题描述】:

我有一个如下所示的 csv:

name: john
date modified: 2018-09
from: jane
colum1 column2 column3
data    data    data 

在从 csv 读取表格数据开始之前,我是否可以应用任何函数来删除任何行?目前column 上面的行在我读入时看起来像奇怪的字符。

新表应如下所示:

colum1 column2 column3
data    data    data 

【问题讨论】:

  • 您可以在阅读时跳过这些行。pandas.pydata.org/pandas-docs/stable/generated/…
  • 无论如何我可以以编程方式跳过这些行吗?我有很多带有这类标题的文件,而不是固定长度的文件。
  • 那么您要保留的第一行是否始终以'column1' 开头?还是您要跳过的标题的最后一行总是以'from:' 结尾?
  • @ALollz 这就是文档没有标准化的问题,所以我不知道标题或列名的结尾。我在想也许会有一个内置函数来检测表格数据列的开始位置
  • 我认为没有完美的方法。根据我的经验,pandas 解析器将使用第 0 行(在 skiprows 之后)作为标题和标记数据的基础。您可以尝试让它自动找出您想要的内容,但例如,它将以from: jane 作为标题列很好地解析文件,这将使您的前两列成为多索引。如果您希望正确执行此操作而不会出现任何错误,您确实需要提出一些算法模式。

标签: python python-3.x pandas csv


【解决方案1】:

我会这样做:

from io import StringIO
with open('filename.csv') as f:
    lines = f.readlines()
s = StringIO(''.join((l for l in lines if ':' not in l)))
pd.read_csv(s)

或者:

with open('filename.csv') as f:
    lines = f.readlines()
skip_rows_idx = [i for i, l in enumerate(lines) if ':' in l]
pd.read_csv('filename.csv', skiprows=skip_rows_idx)

如果标题中没有冒号,则可以修改上述代码(第一个示例)以删除第一行,如下所示:

import itertools
s = StringIO(''.join(itertools.dropwhile(lambda l: ':' in l, lines)))

(假设标题之后没有“坏”行)。

【讨论】:

  • 希望 csv 中没有时间戳:D
  • @ALollz 同意。根据提供的信息,这是我的最佳猜测。
  • @AGNGazer 谢谢你的例子,会有时间戳。
  • @ALollz 如果文档是固定格式的,可​​以简单的替换为前缀行数。
  • @RustyShackleford 这里概述的方法只是展示了如何解决 pandas 中的这个限制。它可以适应其他标准。但是,您不提供其他信息。例如,您希望函数如何知道何时跳过一行?
【解决方案2】:
with open('test.csv') as f:
    reader=csv.reader(f)
    counter=0
    for row in reader:
        if(''.join(row).startswith('colum1')):
            starting_row=counter # get the valid row programatically
        counter+=1
        break
pd.read_csv('test.csv',skiprows=starting_row) # skip previous rows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多