Tengo un problema con el archivo de Excel para clasificar los datos en algunas columnas y filas, necesito organizar las celdas de combinación en la siguiente columna como una fila 1 y la siguiente columna junto a ellas como en estas imágenes:
Aporte:
Salida para lácteos:
Resumen:
primero tomamos la fila Dairy , luego vamos a la segunda columna frente a Dairy y obtenemos datos frente a Dairy , luego vamos a la segunda columna y frente a Milk to Mr. 1 obtenemos Butter to Mrs. 1 y Butter to Mrs. 2 y así sucesivamente...
Después de eso, queremos exportarlo a un archivo de Excel como en la imagen de salida.
He escrito un código que obtiene los datos de la primera columna y encuentra todos los datos delante de él, pero necesito cambiarlo para obtener los datos fila por fila como en la imagen de salida:
import pandas import openpyxl import xlwt from xlwt import Workbook df = pandas.read_excel('excel.xlsx') result_first_level = [] for i, item in enumerate(df[df.columns[0]].values, 2): if pandas.isna(item): result_first_level[-1]['index'] = i else: result_first_level.append(dict(name=item, index=i, levels_name=[])) for level in df.columns[1:]: move_index = 0 for i, obj in enumerate(result_first_level): if i == 0: for item in df[level].values[0:obj['index'] - 1]: if pandas.isna(item): move_index += 1 continue else: obj['levels_name'].append(item) move_index += 1 else: for item in df[level].values[move_index:obj['index'] - 1]: if pandas.isna(item): move_index += 1 continue else: obj['levels_name'].append(item) move_index += 1 # Workbook is created wb = Workbook() # add_sheet is used to create sheet. sheet1 = wb.add_sheet('Sheet 1') style = xlwt.easyxf('font: bold 1') move_index = 0 for item in result_first_level: for member in item['levels_name']: sheet1.write(move_index, 0, item['name'], style) sheet1.write(move_index, 1, member) move_index += 1 wb.save('test.xls')descargue el archivo de entrada Excel desde aquí
¡Gracias por ayudar!
Primero, complete sus datos para completar las celdas en blanco con el último valor válido y cree una colección ordenada usando pd.CategoricalDtype para ordenar la columna del product . Finalmente, solo tiene que iterar sobre las columnas por pares y cambiar el nombre de las columnas para permitir la concatenación. El último paso es ordenar las filas por valor del product .
import pandas as pd # Prepare your dataframe df = pd.read_excel('input.xlsx').dropna(how='all') df.update(df.iloc[:, :-1].ffill()) df = df.drop_duplicates() # Get keys to sort data in the final output cats = pd.CategoricalDtype(df.T.melt()['value'].dropna().unique(), ordered=True) # Group pairwise values data = [] for cols in zip(df.columns, df.columns[1:]): col_mapping = dict(zip(cols, ['product', 'subproduct'])) data.append(df[list(cols)].rename(columns=col_mapping)) # Merge all data out = pd.concat(data).drop_duplicates().dropna() \ .astype(cats).sort_values('product').reset_index(drop=True)Producción:
>>> cats CategoricalDtype(categories=['Dairy', 'Milk to Mr.1', 'Butter to Mrs.1', 'Butter to Mrs.2', 'Cheese to Miss 2 ', 'Cheese to Mr.2', 'Milk to Miss.1', 'Milk to Mr.5', 'yoghurt to Mr.3', 'Milk to Mr.6', 'Fruits', 'Apples to Mr.6', 'Limes to Miss 5', 'Oranges to Mr.7', 'Plumbs to Miss 5', 'apple for mr 2', 'Foods & Drinks', 'Chips to Mr1', 'Jam to Mr 2.', 'Coca to Mr 5', 'Cookies to Mr1.', 'Coca to Mr 7', 'Coca to Mr 6', 'Juice to Miss 1', 'Jam to Mr 3.', 'Ice cream to Miss 3.', 'Honey to Mr 5', 'Cake to Mrs. 2', 'Honey to Miss 2', 'Chewing gum to Miss 7.'], ordered=True) >>> out product subproduct 0 Dairy Milk to Mr.1 1 Dairy Cheese to Mr.2 2 Milk to Mr.1 Butter to Mrs.1 3 Milk to Mr.1 Butter to Mrs.2 4 Butter to Mrs.2 Cheese to Miss 2 5 Cheese to Mr.2 Milk to Miss.1 6 Cheese to Mr.2 yoghurt to Mr.3 7 Milk to Miss.1 Milk to Mr.5 8 yoghurt to Mr.3 Milk to Mr.6 9 Fruits Apples to Mr.6 10 Fruits Oranges to Mr.7 11 Apples to Mr.6 Limes to Miss 5 12 Oranges to Mr.7 Plumbs to Miss 5 13 Plumbs to Miss 5 apple for mr 2 14 Foods & Drinks Chips to Mr1 15 Foods & Drinks Juice to Miss 1 16 Foods & Drinks Cake to Mrs. 2 17 Chips to Mr1 Jam to Mr 2. 18 Chips to Mr1 Cookies to Mr1. 19 Jam to Mr 2. Coca to Mr 5 20 Cookies to Mr1. Coca to Mr 6 21 Cookies to Mr1. Coca to Mr 7 22 Juice to Miss 1 Honey to Mr 5 23 Juice to Miss 1 Jam to Mr 3. 24 Jam to Mr 3. Ice cream to Miss 3. 25 Cake to Mrs. 2 Chewing gum to Miss 7. 26 Cake to Mrs. 2 Honey to Miss 2