pandas .read_excel и to_excel для использования только самого большого листа или листа с большинством столбцов - PullRequest
0 голосов
/ 30 апреля 2020

Есть ли способ, которым я могу прочитать все листы файлов xlsx, а затем отбросить все и купить тот, у которого больше строк?

в идеале я хотел бы найти лист, который буквально содержит наибольшее количество ДАННЫХ, как в размере в байтах, но строки пока будут работать используйте .columns и len, чтобы найти, на каком листе больше всего столбцов

Ответы [ 3 ]

2 голосов
/ 30 апреля 2020

IIU C:

Прочитать все листы файла Excel и сохранить его в dictionary:

xls = pd.ExcelFile('excel_file_path.xls')
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name)

Теперь вы можете l oop над своим словарем и создайте другой словарь с количеством строк данных, например:

row_count_dict = {}     

for key,val in sheet_to_df_map.items():
    row_count_dict[key] = val.shape[0]

Затем найдите максимальное значение row_count_dict по значению:

df_with_max_rows = max(row_count_dict, key=row_count_dict.get)

Затем найдите исходный текст с этим ключом чтобы получить фрейм данных с max_rows:

df = sheet_to_df_map.get(df_with_max_rows)

Это будет ваш последний фрейм данных.

0 голосов
/ 30 апреля 2020

Этот ответ очень похож на ответ Mayank, только он должен быть немного быстрее, поскольку он не создает словарь и не сохраняет в нем проанализированные кадры данных.

wb = pd.ExcelFile(r'path.xlsx')
max_row_count = 0
for sheet in wb.sheet_names:
    parsed_sheet  = wb.parse(sheet)
    row_count = len(parsed_sheet)
    if row_count>max_row_count:
        max_row_count = row_count
        df = parsed_sheet
0 голосов
/ 30 апреля 2020

К сожалению, чтение в меньшем количестве строк с nrows = 1, например, не уменьшает начальное время загрузки. Следующий код найдет лист с наибольшим количеством строк, а затем сохранит его. Обратите внимание, что если к наибольшему количеству строк привязано более 1 листа, будет сохранена только последняя

read_in = pd.read_excel(items, sheet_name = None)
keys = []
for ijk in read_in.keys():
    keys.append(ijk)
list_lens = []
for key in keys:
    list_lens.append(len(read_in[key]))
counter = 0
for lengths in list_lens:
    if lengths == max(list_lens):
        if len(read_in[keys[counter]])>0:
            writer = pd.ExcelWriter(filename, engine='xlsxwriter',options={'strings_to_urls': False})#this ensures you can save longer links that excel tries to make hyperlinks, you can skip it and provide the file name instead of writer below for most code
            read_in[keys[counter]].to_excel(writer, index = False)
            writer.close()#unnecessary if you just gave the file name in the line above instead of using the writer object
    counter = counter +1

. То, что происходит здесь, заключается в том, что при чтении с листами = None их все считывает и создает словарь, в котором ключами являются имена листов, а значениями - кадры данных всего листа. Затем вы получаете доступ к каждому фрейму данных, проверяя количество столбцов. Затем код использует эту информацию для сохранения только того информационного кадра, к которому можно получить доступ, используя ключ, который заканчивается большинством столбцов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...