【问题标题】:handle comment lines when reading csv using pandas使用 pandas 读取 csv 时处理注释行
【发布时间】:2021-08-22 01:02:24
【问题描述】:

这是一个简单的例子:

import pandas as pd
from io import StringIO
s = """a   b   c
------------
A1    1    2
A-2  -NA-  3
------------
B-1   2   -NA-
------------
"""
df = pd.read_csv(StringIO(s), sep='\s+', comment='-')
df

a   b   c
0   A1  1.0 2.0
1   A   NaN NaN
2   B   NaN NaN

对于包含但不以注释说明符开头的行,pandas 将来自 - 的子字符串视为 cmets。


我的问题如上。

不重要,只是为了好奇,pandas 可以处理两种不同类型的注释行:以#- 开头

import pandas as pd
from io import StringIO
s = """a   b   c
# comment line
------------
A1   1    2
A2  -NA-  3
------------
B1   2   -NA-
------------
"""
df = pd.read_csv(StringIO(s), sep='\s+', comment='#-')
df

加注 ValueError: Only length-1 comment characters supported

【问题讨论】:

    标签: python pandas dataframe csv comments


    【解决方案1】:

    如果我正确理解您的问题,我认为解决您的问题的最佳方法是在将 CVS 文件传递​​给 pandas 之前进行一些预处理。

    例如,您可以使用 Regex 创建一个没有任何注释的临时 CVS 文件并将其传递给 pandas。

    【讨论】:

    • 我真正的问题如第一个例子所示。对于第二个,我按照您所说的进行了预处理,方法是使用 grep 预先删除以“#”开头的行。我只是好奇pandas 是否有一个简单的解决方案来处理它。
    • 看来第二个例子让你们分心了。
    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    【解决方案2】:

    另一种解决方案:您可以在.read_csv 之前“预处理”文件。例如:

    import re
    import pandas as pd
    from io import StringIO
    
    
    s = """a   b   c
    # comment line
    ------------
    A1    1    2
    A-2  -NA-  3
    ------------
    B-1   2   -NA-
    ------------
    """
    
    df = pd.read_csv(
        StringIO(re.sub(r"^-{2,}", "", s, flags=re.M)), sep=r"\s+", comment="#"
    )
    print(df)
    

    打印:

         a     b     c
    0   A1     1     2
    1  A-2  -NA-     3
    2  B-1     2  -NA-
    

    【讨论】:

      【解决方案3】:

      csv 包仅支持一种类型的注释行。选择一个,然后删除另一个。例如:

      df = pd.read_csv(StringIO(s), sep='\s+', comment='-')
      

      这个给你

          a        b     c
      0   #  comment  line
      1  A1        1     2
      2  A2      NaN   NaN
      3  B1        2   NaN
      

      现在在具有# 起始列a 的任何行上使用drop

      【讨论】:

      • 这不是一个好方法。如果注释行# comment line# comment a b c d(与数据的列数不同),则数据框形状会改变
      • 在这种情况下,我们检查规范以查看连字符是否为单数。在后面的连字符行中使用#drop 的注释标记。如果两者都不是,那么上面的方法将不起作用。
      猜你喜欢
      • 2020-12-15
      • 2023-04-03
      • 1970-01-01
      • 2021-12-15
      • 2022-10-13
      • 2021-12-06
      • 2021-11-08
      • 1970-01-01
      • 2013-10-23
      相关资源
      最近更新 更多