使用 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-
这是一个简单的例子:
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-