Чтение выбранных данных с помощью read_excel - PullRequest
0 голосов
/ 21 февраля 2019

enter image description here У меня есть файл Excel, из которого я хочу прочитать информацию ниже с read_excel:

Столбец C в качестве индекса,

Столбцы D дляAH and Rows [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: Ожидается 50 полей в строке 2, увидел52 ”

Вот что я пробовал:

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

Любая помощь?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Инструменты ввода-вывода Pandas хороши тем, что для простых случаев использования они делают правильные вещи и загружают весь файл одной (простой) командой.Недостатком является то, что они могут быть недостаточно универсальными для слишком сложных случаев использования.Поэтому я бы экспортировал лист 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 мог обрабатывать многострочные поля.

0 голосов
/ 21 февраля 2019

Следуя вашей логике, я создаю список выбранных строк и использую полосы пропускания и строки для выбора строк в файле 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...