Как игнорировать пользовательский заголовок в Pandas - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь найти творческий способ получить фрейм данных нескольких листов в электронной таблице, который довольно нестандартный, но я не могу найти способ сделать это.

Если я попробую это:

file= 'filename.xlsx'
df = xlrd.open_workbook(file)
print(df)

Это мой текущий вывод:

        A          |     B     |    C
1    Random text   | Empty cell|Empty cell
    ------------------------------------
2    Empty cell    |           |
    ------------------------------------
3    Empty cell    |           |
    ------------------------------------  
4    CODE          |HEADER 2   | HEADER 3
    ------------------------------------    
5    INFORMATION   |INFORMATION|INFORMATION

Я хочу запустить свой фрейм данных в строке и столбце CODE, но pandas просто получает ячейку "Random text" в качестве первой cell

Это мой желаемый вывод:

4    CODE          |HEADER 2   | HEADER 3
    ------------------------------------    
5    INFORMATION   |INFORMATION|INFORMATION

Как бы вы заставили Pandas игнорировать первые строки? Он должен быть основан на значениях, потому что на следующих листах CODE начинается в строке 8, а в следующей - в строке 3

Ответы [ 4 ]

1 голос
/ 18 января 2020

В моем предыдущем ответе я указал решение stati c, и в этом я добавил вспомогательную функцию для разбора динамического c. get_header_index вспомогательная функция динамически получает индекс строки, содержащей ключевое слово header в первом столбце. Вы можете изменить аргумент col_index, если считаете, что ключевое слово заголовка находится в другом столбце. Точно так же вы можете изменить ввод ключевого слова по своему усмотрению. Вывод dfs - это словарь фреймов данных, где ключи - это имена листов данной рабочей книги.

import pandas as pd

def get_header_index(sheet, col_index=0, keyword='code'):
    arr = sheet[sheet.columns[int(col_index)]]
    header_index = arr[arr.str.contains(str(keyword), na=False)].iloc[[0,]].index[0]
    return header_index

file = 'filename.xlsx'
sheets_dict = pd.read_excel(open(file, 'rb'), sheet_name=None)

dfs = {}
for name, sheet in sheets_dict.items():
    header = get_header_index(sheet, col_index=0, keyword='code') + 1
    df = pd.read_excel(open(file, 'rb'), sheet_name=name, header=header)
    dfs[name] = df
1 голос
/ 17 января 2020

Вы можете попробовать:

import pandas as pd

file= 'filename.xlsx'
df = pd.read_excel(open(file, 'rb'),sheet_name='sheetname', skiprows=[0,1,2])

В качестве альтернативы вы можете использовать аргумент заголовка, как упоминалось ранее.

1 голос
/ 17 января 2020

Не уверен насчет XLRD, но Pandas имеет простой способ в методе чтения Excel, который позволяет вам указать, какая строка является вашим заголовком. Это было бы легко исправить, если вы не собираетесь использовать XLRD.

0 голосов
/ 17 января 2020

Это форма того, что я сделал в своей книге, с учетом вашего использования (основываясь на моем предыдущем комментарии):

for file in file_names:  # Iterate through all of the individual report files
        book = xlrd.open_workbook(file)
        sheetname = get_sheetname(book)
        if sheetname is not None:  # Check that sheet name is valid
            sheet = book.sheet_by_name(sheetname)
            nrows = sheet.nrows
            ncols = sheet.ncols
            for i in range(nrows):
                for j in range(ncols):
                    check = sheet.cell_value(i, j) 
                    if check.contains("CODE"):
                        return (i, j)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...