Как разделить большой файл Excel на несколько листов на основе заданного IP-адреса с помощью pandas python

#python #excel #pandas

#python #excel #pandas

Вопрос:

Я новичок в pandas и python, поэтому столкнулся с некоторыми проблемами. У меня есть один большой файл Excel, который мне нужно разделить на несколько листов с помощью скрипта python. Что я должен разделить базу на IP-адреса, указанные в данных. Я не могу понять, как это сделать, и был бы признателен за некоторую помощь и указания. Я ничего не знаю о работе с python или какими-либо библиотеками раньше. Это то, что я сделал, но создал рабочие книги для каждой строки.

 import pandas as pd
df = pd.read_excel("D:/Users/Zakir/Desktop/MyNotebooks/Legacy.xls", sheet_name="Total", header=0, names=None, index_col=None, parse_cols=None, usecols=None, squeeze=False, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, keep_default_na=True, verbose=False, parse_dates=False, date_parser=None, thousands=None, comment=None, skipfooter=0, convert_float=True, mangle_dupe_cols=True)

writer = pd.ExcelWriter('D:/Users/Zakir/Desktop/MyNotebooks/pandas_simple.xlsx', engine='xlsxwriter')
for index, row in df.iterrows():
    df1 = df.iloc[[index]]
    df1.set_index('Number',inplace=True)
    df1.to_excel(writer,  sheet_name=row['IPAddress'])
writer.save()
  

У меня есть такой файл Excel. более 5000 строк. Существует 60 групп IP-адресов, и каждую группу необходимо разделить на отдельный лист

Комментарии:

1. openpyxl Для этого проще использовать библиотеку. openpyxl.readthedocs.io/en/stable . Кроме того, вы должны предоставить то, что вы сделали, и структуру вашего файла Excel, чтобы мы не работали здесь в air. В противном случае я мог бы просто сказать for i in df['ip_address']: wb.create_sheet(i)

2. @ycx спасибо за ответ. Да, извините, я отредактировал вопрос, не уверен, что справился с работой лучше. Приношу свои извинения за то, что впервые использую stackoverflow, поэтому привыкаю к нему. Мы были бы очень признательны за вашу помощь. Я все еще не уверен, достаточно ли хорошо я объяснил ситуацию

3. Ручной метод в Excel заключается в сортировке, а затем в копировании и вставке… Или продублируйте файл и отсортируйте, затем удалите ненужные, промойте повтор…

4. @SolarMike Спасибо за ваш вклад! Да, я выполнил задачу вручную, используя kutools, но требуется написать скрипт для ее выполнения, поэтому придерживаюсь этого 🙂

5. Итак, рассмотрим vba … вы знаете метод get excel vba для его повторения…

Ответ №1:

одно из решений, если у вас достаточно памяти:

 from pandas import ExcelWriter
df = pd.read_excel('file',sheet_name="Total", header=0, #other settings.....#)
writer = ExcelWriter('E:/output.xlsx',engine='xlsxwriter')
print(df)
def writesheet(g):
    a = g['IPAddress'].tolist()[0]
    g.to_excel(writer, sheet_name=str(a), index=False)# index = True if you want to keep index


df.groupby('IPAddress').apply(writesheet)
writer.save()
  

Ответ №2:

Вот как я реализовал код для проверки папки, перебора всех файлов Excel и разделения каждого файла по значениям имени столбца, которое может быть передано в качестве входных данных (vColName), предполагая, что в файле один лист:

 import sys
import os, shutil
from os import listdir
from os.path import isfile, join
import pandas as pd
import urllib as ul
import datetime
import xlrd

#this method retrieves all the xlsx filenames from a folder
def find_excel_filenames( path_to_dir, suffix=".xlsx" ):
    filenames = listdir(path_to_dir)
    return [ filename for filename in filenames if filename.endswith( suffix ) ]

#this folder contains .xlsx files
filePath = "D:filessample"

#there is a subfolder in my solution to move the processed files to
#and another subfolder to move the splitted output files
archivePath = os.path.join(filePath, "archive")
outPath = os.path.join(filePath, "output")

#get a list of filenames
fnames = find_excel_filenames(filePath)

#loop through each file
for fl in fnames:
    vFile = os.path.join(filePath, fl)
    #load the content of the file to a data frame, 
    #I open the file twice, first to get the number of columns and
    #create the converter, then to open the file with string converter
    #it helps with trimming of leading zeros

    df = pd.read_excel(vFile, header=None)

    column_list = []
    for i in df:
        column_list.append(i)

    converter = {col: str for col in column_list} 

    df1 = pd.read_excel(vFile, converters=converter)
    colValues=df1[vColName].unique().tolist()

    for v in colValues:
        filteredDF = df1.loc[df1[vColName]==v]
        vOutFile = os.path.join(outPath, fl ''_'' v.replace("/"," ") ''.xlsx'')
        writer = pd.ExcelWriter(vOutFile, engine=''xlsxwriter'')
        # Convert the dataframe to an XlsxWriter Excel object.
        filteredDF.to_excel(writer, sheet_name=''Sheet1'')
        # Close the Pandas Excel writer and output the Excel file.
        writer.save()

    #move the processed file to an archive folder
    dst_file = os.path.join(archivePath, fl)
    if os.path.exists(dst_file):
        os.remove(dst_file)
    shutil.move(vFile, archivePath)