pandas read_csv与列标题中的井号

时间:2016-09-14 08:37:16

标签: python python-3.x pandas

我需要从制表符分隔的文件中读取数据,其中第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
"""

我有一个解决方案(下面发布的答案),但感觉可能有更好的方法。

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206152289-Is-it-possible-to-debug-compiled-classes-instead-of-the-source-

2 个答案:

答案 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 REdChum中提供的初始列中前导空格的修正。

似乎比我尝试过的各种各样的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)

Image

相关问题