Python 使用带有注释标题的熊猫读取csv

Python 使用带有注释标题的熊猫读取csv,python,csv,pandas,Python,Csv,Pandas,我的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将完全忽略该行 有没有简单的方法

我的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
将完全忽略该行

有没有简单的方法来处理这个案子

第二个相关问题是我如何处理引用在这种情况下,它不使用

它与
#
不匹配:

谢谢

+Update

下面是对第二个示例的测试

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))

您可以通过以下方式重命名
read\u 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})
您可以通过以下方式删除文件的第一个#:

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

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

您不能为这两种情况重命名错误的列名吗?似乎你滥用了
comment
参数,因为它是专门为忽略注释行而设计的。在第二种情况下,我只是重命名它,这不是什么大问题。在第二种情况下,我不能重命名,我有两列,一列名为
#“one
,另一列名为
one”
。这不是“错误列”。这是一种很常见的情况,熊猫无法妥善处理。感谢这对第一个案例有效,对第二个案例有什么建议吗?在那里我得到了一个额外的
NaN
列您想重命名/删除
NaN
列吗?不,在第二种情况下,我得到了4列,第一列名为
#“一列”
,第二列名为
one
。重命名不起作用。@AndreaZonca很抱歉,您有3个值,但有4列,这毫无意义,这意味着一个
NaN
值我想要3列,而不是4列,因为
的原因,pandas不能正确引用。检查我最后的两个例子。
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})
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