我有一个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")
有帮助吗?
感谢!
答案 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模块可以处理多行字段。