2015-05-18 94 views
2

熊猫我有#在标题行的CSV文件:阅读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 

谢谢!

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

这里是用于第二实施例的测试。这样

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}) 
+1

难道你只是重命名错误的列名称为两种情况?好像你滥用了'comment'参数,当它被设计为忽略注释行时,第二种情况下,我只是重命名它,没有什么大不了 – EdChum

+0

在第二种情况下我不能重命名,我有2列,一个名为'#“一个,另一个名为'one''。 –

回答

1

可以重命名read_csv()输出的第一头这样是你需要加载整个文件在内存中,但它的工作原理。

+0

感谢这对第一个案件的作品,对第二个案件的任何建议?我有一个额外的'NaN'列 –

+0

你想重命名/删除'NaN'列吗? – farhawa

+0

不,在第二种情况下,我得到4列,第一个命名为“#”,第二个“1”。重命名将不起作用。 –

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 

的不便

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

好吧,如果没有其他的作品这是好的! –