我需要从制表符分隔的文件中读取数据,其中第1行包含列标题,但该行的第1个字符是井号/ octothorpe / hastag #
。
数据如下所示:
FILE_CONTENTS = """\
# year-month-day spam eggs
1956-01-31 11 21
1985-03-20 12 22
1940-11-22 13 23
"""
我有一个解决方案(下面发布的答案),但感觉可能有更好的方法。
答案 0 :(得分:1)
这会得到所需的DataFrame
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()
N.B。已修改为包含related question about doing this in R对EdChum中提供的初始列中前导空格的修正。
似乎比我尝试过的各种各样的kludges更好:
with open(filename) as f:
header = f.readline()
cols = header.strip('#').split()
df = pd.read_csv(..., comment='#', names=cols)
编辑:看到comment的回答我意识到我必须在文件标题中处理#<space>year-month-day ...
和 #<tab>year-month-day ...
。
所以我们需要结合使用Nikil和EdChum的方法
答案 1 :(得分:0)
您仍然需要将列名称向左移动一个位置,以便考虑因删除#
char而创建的空列。
然后,删除其值均为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)