【问题标题】:Keep CSV file's comment lines in pandas?将 CSV 文件的注释行保留在 pandas 中?
【发布时间】:2018-07-21 07:01:06
【问题描述】:

我刚刚开始研究 Pandas 的世界,我发现的第一个奇怪的 CSV 文件是一个开头有两行 cmets(具有不同的列宽)的文件。

sometext, sometext2
moretext, moretext1, moretext2
*header*
actual data ---
---------------

我知道如何使用skiprowsheader= 跳过这些行,但是,我将如何在使用read_csv 时保留这些cmets?有时 cmets 作为文件元信息是必需的,我不想把它们扔掉。

【问题讨论】:

  • 是否有说明 CSV 文件具有 cmets 或任何元数据的文件规范?只需将这两行读入一个单独的变量
  • 嗯,您作为原始数据导入的内容始终可以保留。 IIUC 您可能会更好地使用iloc[some_row:] 并为其余的计算创建 DF 的副本。不是最节省内存的方式,但这取决于您的具体问题。
  • @roganjosh 您能否详细说明iloc[some_row:] 以提取原始数据?
  • @Coolio2654,如果以下解决方案之一有助于您随意接受一个(勾选左侧)。这将帮助其他用户解决同样的问题。

标签: python pandas csv import comments


【解决方案1】:

Pandas 旨在读取结构化数据。

对于非结构化数据,只需使用内置的open

with open('file.csv') as f:
    reader = csv.reader(f)
    row1 = next(reader)  # gets the first line
    row2 = next(reader)  # gets the second line

您可以像这样将字符串附加到数据框:

df.comments = 'My Comments'

But note:

但是请注意,虽然您可以将属性附加到 DataFrame, 在 DataFrame 上执行的操作(例如 groupby、pivot、join 或 loc 仅举几例)可能会返回一个没有 附加元数据。 Pandas 还没有可靠的方法 传播附加到 DataFrames 的元数据。

【讨论】:

  • 好的,信息量很大,我会确保我理解基本的文件 IO。那么,如何将这些提取的 cmets 重新导入到我的最终 pandas 框架中呢?最好在顶部?
  • 不清楚你的意思。如果前 2 行中的列对齐,请使用 pd.read_csv 并且不要跳过它们。如果它们不对齐,您打算如何“重新导入最终数据框”?有关元数据,请参阅Adding meta-information/metadata to pandas DataFrame
  • 我只是想以某种方式将这些 cmets 作为明确的 cmets 包含在我的 pandas 对象中,而不是常规数据的一部分,占据像列名这样的特殊状态。所以现在我在想我可以使用你的代码 A) 提取 cmets,B) 将 cmets 之后的 csv 中的所有内容输入 pandas,C) 以某种方式将 cmets 附加到 pandas 对象中。
  • @Coolio2654,查看我的更新,这是可能的,但有大量免责声明。
  • 这似乎和我预期的一样有效,因为我问的是 Pandas 的非正统特性。我的最后一个问题是,如果文件再次保存为 csv,是否将包含 df.comments 中的任何内容。
【解决方案2】:

您可以先读取元数据,然后使用read_csv

with open('f.csv') as file:
    #read first 2 rows to metadata
    header = [file.readline() for x in range(2)]
    meta = [value.strip().split(',') for value in header]
    print (meta)
    [['sometext', ' sometext2'], ['moretext', ' moretext1', ' moretext2']]

    df = pd.read_csv(file)
    print (df)

          *header*
    0  actual data

【讨论】:

  • 当我选择另一个答案作为最后一个答案时,bec。 jp 为我澄清了绝对不可能在 pandas 中包含注释行,并通过 df.comments 向我展示了一个临时解决方案,这个答案首先帮助我提取了这些 cmets。谢谢,杰兹瑞尔。
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2015-10-07
相关资源
最近更新 更多