Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pandas read_csv,列标题中带有磅符号_Python_Python 3.x_Pandas - Fatal编程技术网

Python pandas read_csv,列标题中带有磅符号

Python pandas read_csv,列标题中带有磅符号,python,python-3.x,pandas,Python,Python 3.x,Pandas,我需要从以制表符分隔的文件中读取数据,其中第一行包含列标题,但该行的第一个字符是一个磅符号/八进制/hastag/ 数据如下所示: # year-month-day spam eggs 1956-01-31 11 21 1985-03-20 12 22 1940-11-22 13 23 read\u csv犯3个错误:1。它将包括任何前导的磅符号作为其自己的唯一列,或作为第一列的第一个字符,从而导致列过多或将空格、制表符和逗号保留为列名的一部分,即使被告知这是分隔符也是

我需要从以制表符分隔的文件中读取数据,其中第一行包含列标题,但该行的第一个字符是一个
磅符号
/
八进制
/
hastag
/

数据如下所示:

#   year-month-day  spam    eggs
1956-01-31  11  21
1985-03-20  12  22
1940-11-22  13  23
read\u csv
犯3个错误:1。它将包括任何前导的磅符号作为其自己的唯一列,或作为第一列的第一个字符,从而导致列过多或将空格、制表符和逗号保留为列名的一部分,即使被告知这是分隔符也是如此。2.制表符、空格、逗号、单引号和双引号分隔符将随机用作列的分隔符,文档中未定义优先级系统,具体取决于分隔符是否位于空格旁边,例如
'abc'、'xyz'
'abc'、'xyz'
3.如果转义定义为反斜杠,则转义字符将不会被视为文字。 4.如果您要求pandas推断上述任何内容或标题,则上述所有内容都将被错误推断

看起来唯一可行的选择是1:滚动您自己的告诉标题读取功能,然后2:告诉熊猫
read\u csv
忽略标题列


有更好的方法吗?

这将提供所需的
数据帧

from io import StringIO
import pandas as  pd

FILE_CONTENTS = """\
# year-month-day    spam    eggs
1956-01-31  11  21
1985-03-20  12  22
1940-11-22  13  23
"""
df = pd.read_csv(StringIO(FILE_CONTENTS), delim_whitespace=True, escapechar='#')
df.columns = df.columns.str.strip()
注意:已编辑,以在中提供的初始列中包含对前导空白的修复

似乎比我尝试过的各种乱七八糟的东西更可取:

with open(filename) as f:
    header = f.readline()
cols = header.strip('#').split()
df = pd.read_csv(..., comment='#', names=cols)
编辑:看到的答案,我意识到我必须处理文件标题中的
#年-月-日…
#年-月-日…

因此,我们需要结合Nikil和EdChum的方法

您仍然需要将列名向左移动一个位置,以说明由于删除
#
字符而创建的空列

然后,删除所有值均为
NaN
的额外列

def column_cleaning(frame):
    frame.columns = np.roll(frame.columns, len(frame.columns)-1)
    return frame.dropna(how='all', axis=1)

FILE_CONTENTS = """\
#   year-month-day  spam    eggs
1956-01-31  11  21
1985-03-20  12  22
1940-11-22  13  23
"""

df = pd.read_csv(StringIO(FILE_CONTENTS), delim_whitespace=True, escapechar="#")

column_cleaning(df)

df=pd.read\u csv(StringIO(文件内容),delim\u空格=True,escapechar='#',skipinitialspace=True)
带和不带
skipinitialspace
参数在
“年-月-日”处留下前一个空格,如果传递
escapeshar
param,则它似乎被忽略,因此需要修剪前导空格
df.columns=df.columns.str.strip()
minor point,但是,通常您想要改进的代码包含在问题中,因为数据可以有
#colu name
#colu name
我们可以将您的
column\u cleaning
包装在
中,如果“”==frame.columns[0]。strip():
并将EdChums
df.columns=df.columns.str.strip()