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