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():
并将EdChumsdf.columns=df.columns.str.strip()