使用read_excel读取所选数据

时间:2019-02-21 13:40:27

标签: python pandas dataframe

enter image description here我有一个excel文件,我想通过read_excel读取以下信息:

列C为索引,

列D到AH和行[5:15],[18:21],[24:75],[78:80],[84:92],[94:95]作为数据帧的数据包含

行1作为数据框的列名称。

1)如何仅读取特定行?

2)尽管我写了use_cols =“ D:AH”,但它仍然读取所有列,即使是AH之后的那些列

3)当我设置use_col = 2以将列C作为索引时,出现错误“ pandas.errors.ParserError:第2行中应有50个字段,看到了52个”

这是我尝试过的:

Timetable = pd.read_excel(filename, sheet_name = "Sheet1", index_col = 2, use_cols = "D:AH")

有帮助吗?

感谢!

2 个答案:

答案 0 :(得分:1)

按照您的逻辑,我创建了要选择的行的列表,并使用了行和行来选择Excel文件中的行

rowstoselect = [[5,15], [18,21], [24,75], [78,80], [84,92], [94,95]]

#read first line to set as name of column
T1 = pd.read_excel("e:\\test.xlsx", sheet_name = "Sheet1", header = None, nrows=1,usecols = "D:AH")
T1 = T1.transpose().astype(str) # convert date to str
T1 = T1[0].values.tolist()
T1.insert(0, "T")          # give a name to index

TimeTable = pd.DataFrame()
for r in rowstoselect:
    T = pd.read_excel("e:\\test.xlsx", sheet_name = "Sheet1", header = None, skiprows=r[0]-1,nrows = r[1] - r[0] + 1, converters={'Date': str}, usecols = "A:AH")
    TimeTable = TimeTable.append(T)

TimeTable.drop(TimeTable.columns[[0, 1]], axis=1, inplace=True) # drop columns A and B

TimeTable.columns = T1   # rename column
TimeTable.set_index('T', inplace=True) # index

答案 1 :(得分:0)

Pandas IO工具之所以出色,是因为对于简单的用例而言,它们做的正确,并且可以通过一个(简单的)命令加载整个文件。不利的一面是,对于过于复杂的用例,它们可能不够通用。因此,我将Excel工作表导出到csv并使用Python csv模块对文件进行预处理:

def get_data(fd, cur_line, lines, cols):
    rd = csv.reader(fd)
    for first, last in row_index:
        while cur_line < first:
            _ = next(fd)
            cur_line += 1
        while cur_line <= last:
            yield next(rd)[cols[0]:cols[1]]
            cur_line += 1

def process(fd, col_index, row_index):
    _ = next(fd)  # skip first line
    rd = csv.reader(fd)
    row = next(rd)
    columns = ['ix'] + row[col_index[0]:col_index[1]]
    df = pd.DataFrame(get_data(fd, 3, row_index,
                               (col_index[0]-1, col_index[1])),
                      columns = columns).set_index('ix')
    df.index.name = ''
    return df

对于您的文件,我将使用:

col_index = (3,34)
row_index = ((5,15), (18,21), (24,75), (78,80), (84,92), (94,95))
df = process(open(csv_filename, newline=''), col_index, row_index)

该文件仅处理一次,仅处理相关行,并且仅使用相关列来填充数据框。唯一的限制是被忽略的行不能包含多行字段。如果需要,您应该在上述函数中将next(fd)替换为next(rd),以使csv模块可以处理多行字段。