使用 pandas 读取 csv 时处理注释行

handle comment lines when reading csv using pandas

这是一个简单的例子:

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- 中的子字符串视为注释。


我的问题如上

不重要,只是出于好奇,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

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

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

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

另一个解决方案:您可以在.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-