使用Pandas读取带有注释标题的CSV文件

6

我有一些CSV文件,在标题行中有#

s = '#one two three\n1 2 3'

如果我使用pd.read_csv#符号将出现在第一个标题中:

import pandas as pd
from io import StringIO
pd.read_csv(StringIO(s), delim_whitespace=True)
     #one  two  three
0     1    2      3

如果我设置参数comment='#',那么pandas会完全忽略该行。有没有简单的方法来处理这种情况?第二个相关问题是如何处理引用,在没有#的情况下可以工作:
s = '"one one" two three\n1 2 3'
print(pd.read_csv(StringIO(s), delim_whitespace=True))
   one one  two  three
0        1    2      3

它不适用于#

s = '#"one one" two three\n1 2 3'
print(pd.read_csv(StringIO(s), delim_whitespace=True))
   #"one  one"  two  three
0      1     2    3    NaN

谢谢!

++++++++++ 更新

这里是第二个示例的测试。

s = '#"one one" two three\n1 2 3'
# here I am cheating slicing the string
wanted_result = pd.read_csv(StringIO(s[1:]), delim_whitespace=True)
# is there a way to achieve the same result configuring somehow read_csv?
assert wanted_result.equals(pd.read_csv(StringIO(s), delim_whitespace=True))

1
你不能只是为两种情况重命名错误的列名吗?当第二种情况只需要重命名它时,似乎你在滥用“comment”参数,而该参数的设计是专门用于忽略注释行。这不是什么大问题。 - EdChum
在第二种情况下,我无法重命名,因为我有两列,一列名为#"one,第二列名为one" - Andrea Zonca
这不是一个“错误的列”。这是一种非常普遍的情况,pandas无法正确处理。 - Slava
2个回答

1
你可以通过以下方式重命名 read_csv() 输出的第一个标题:

import pandas as pd

from io import StringIO
df = pd.read_csv(StringIO(s), delim_whitespace=True)
new_name =  df.columns[0].split("#")[0]
df.rename(columns={df.columns[0]:new_name})

谢谢,这适用于第一个案例,请问第二个案例有什么建议?在那里我得到了一个额外的NaN列。 - Andrea Zonca
您想重命名/删除 NaN 列吗? - farhawa
不,第二种情况下我得到了4列,第一列名为#"one,第二列名为one"。重命名无法解决这个问题。 - Andrea Zonca
@AndreaZonca 抱歉,这没有意义,你有3个值但是4列,这意味着一个NaN值。 - EdChum
我想要3列,而不是4列,因为#的缘故,pandas无法正确引用。请检查我的最后两个示例。 - Andrea Zonca
显示剩余2条评论

1
您可以通过以下方式删除文件名的第一个#号:
s = u'#"one one" two three\n1 2 3'

import pandas as pd
from io import StringIO

wholefile=StringIO(s).read().split("#")[1]

pd.read_csv(StringIO(wholefile), delim_whitespace=True)

   one one  two  three
0        1    2      3

不方便的是需要将整个文件加载到内存中,但它可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接