Итерация по рабочей книге XLSX и сохранение уникальных значений в volumn из фрейма данных на отдельный лист

#python #excel #pandas

Вопрос:

Это немного запутанно. Но у меня есть таблица ввода в XLSX, в которую я преобразую с помощью pandas groupby, чтобы суммировать стоимость поставщика [уникальное значение], затем ранжировать и привязывать сумму этих затрат. Затем я хочу выполнить итерацию по таблице, получая уникальное значение в столбце, связанные значения с этим уникальным значением и сохраняя его на своем собственном листе, каждый в пределах одной рабочей книги.

Я продолжаю получать сообщение об ошибке:

 IndexError: string index out of range. 
 

Я не понимаю, почему, когда я пытаюсь ранжировать и объединять итоговую группу, я получаю ошибку индексации при попытке выполнить итерацию. У меня есть рабочая книга и скрипт на моем github. Конечный результат будет похож на картинку ниже для каждого уникального поставщика. Спасибо, Я. Я ценю это. Ссылка на Github здесь: https://github.com/beingandbrian/xlsx_supplier_scorecard_tables.git
введите описание изображения здесь

Ответ №1:

Я попытался воспроизвести ваш код в своем ноутбуке Jupyter:

 # imports
import os
from pathlib import Path
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from more_itertools import unique_everseen
# from udfs import *

def agg_rank_bin_rename_join(df_i_want_to_agg, attributes, value):
if not isinstance(attributes, list):
    attributes = [attributes]

value_dict = { key: ['sum'] for key in value } if isinstance(value, list) else { value: ['sum'] }

df_simp_arith = df_i_want_to_agg.groupby(attributes).agg(value_dict)
df_simp_arith.columns = ['Sum']

df_rank = df_simp_arith.rank(ascending=1, method='dense').add_prefix('Rank ') 
bin_labels = ['Least Expensive', 'Less Expensive', 'Average', 'More Expensive', 'Most Expensive']

df_bin = df_rank.apply(lambda x: pd.qcut(x, q=[0, .2, .4, .6, .8, 1], labels=bin_labels))
output = df_simp_arith.join(df_rank).join(df_bin.add_prefix('Bin '))
output = output.copy(deep=True)
return output

def add_df_to_ws(the_ws_title_name, the_df):
ws_loaded_object = wb_loaded_object.create_sheet(title = the_ws_title_name)

for r in dataframe_to_rows(the_df, index = False, header = True):
    ws_loaded_object.append(r)

for cell in ws_loaded_object['A']   ws_loaded_object[1]:
    cell.style = 'Pandas'
 

Я использую простой readexcel без какого-либо импорта ОС

 # read in xlsx filepath data in as a df
df_loaded = pd.read_excel(r'C:/Users/ttayyab/Downloads/input.xlsx')
# transform the df using groupby
df_groupby = agg_rank_bin_rename_join(df_loaded, ['Supplier Name', 'Paid Date FY Year'], 'Total Net Amount').reset_index()

# create a list of unique values in index attribute column
unique_values_in_attribute_column_list = list(df_groupby['Supplier Name'].unique())

#output

 ['Alexandra Hodge',
 'Brian Lee',
 'Carrie Caldwell',
 'Cynthia Jones DVM',
 'Danielle Leblanc',
 'Destiny Swanson',
 'Drew Le',
 'Jason Castaneda',
 'Jonathan Tran',
 'Joyce Green',
 'Karen Tran',
 'Melissa Wang',
 'Michael Nguyen',
 'Mrs. Teresa Thompson DDS',
 'Patrick Herrera',
 'Rachel Odom',
 'Vincent Coleman']
 

Я создал пустой список data , вызываемый для добавления значений фрейма данных:

 data = []
for i, each_unique_value in enumerate(unique_values_in_attribute_column_list):
    data.append(df_groupby.loc[df_groupby['Supplier Name'] == each_unique_value])
 

В ячейке Jupyter это выглядит следующим образом:

 [     Supplier Name Paid Date FY Year    Sum  Rank Sum     Bin Rank Sum
 0  Alexandra Hodge            FY2018  590.5       2.0  Least Expensive
 1  Alexandra Hodge            FY2019  745.0       4.0  Least Expensive
 2  Alexandra Hodge            FY2020  165.0       1.0  Least Expensive,
   Supplier Name Paid Date FY Year           Sum  Rank Sum    Bin Rank Sum
 3     Brian Lee            FY2018  301250.03965      34.0  More Expensive
 4     Brian Lee            FY2019  711728.51000      40.0  More Expensive
 5     Brian Lee            FY2020  584431.09000      38.0  More Expensive,
      Supplier Name Paid Date FY Year         Sum  Rank Sum    Bin Rank Sum
 6  Carrie Caldwell            FY2018  1324015.88      45.0  Most Expensive
 7  Carrie Caldwell            FY2019  3613888.51      50.0  Most Expensive
 8  Carrie Caldwell            FY2020  3013043.44      49.0  Most Expensive,
         Supplier Name Paid Date FY Year        Sum  Rank Sum    Bin Rank Sum
 9   Cynthia Jones DVM            FY2018   56917.16      19.0  Less Expensive
 10  Cynthia Jones DVM            FY2019  179481.53      31.0         Average
 11  Cynthia Jones DVM            FY2020   99613.13      22.0         Average,
        Supplier Name Paid Date FY Year       Sum  Rank Sum     Bin Rank Sum
 12  Danielle Leblanc            FY2018   1768.76       6.0  Least Expensive
 13  Danielle Leblanc            FY2019  27246.60      15.0   Less Expensive
 14  Danielle Leblanc            FY2020   2871.86       7.0  Least Expensive,
       Supplier Name Paid Date FY Year        Sum  Rank Sum    Bin Rank Sum
 15  Destiny Swanson            FY2018  145049.74      27.0         Average
 16  Destiny Swanson            FY2019  145257.46      28.0         Average
 17  Destiny Swanson            FY2020   28073.53      16.0  Less Expensive,
    Supplier Name Paid Date FY Year        Sum  Rank Sum    Bin Rank Sum
 18       Drew Le            FY2018   26412.38      14.0  Less Expensive
 19       Drew Le            FY2019  125407.70      24.0         Average
 20       Drew Le            FY2020  132418.75      25.0         Average,
       Supplier Name Paid Date FY Year        Sum  Rank Sum    Bin Rank Sum
 21  Jason Castaneda            FY2018  115625.69      23.0         Average
 22  Jason Castaneda            FY2019  433708.13      35.0  More Expensive
 23  Jason Castaneda            FY2020  145646.68      29.0         Average,
     Supplier Name Paid Date FY Year      Sum  Rank Sum     Bin Rank Sum
 24  Jonathan Tran            FY2018  15000.0      10.0  Least Expensive
 25  Jonathan Tran            FY2019  16300.0      11.0  Least Expensive
 26  Jonathan Tran            FY2020  18900.0      12.0   Less Expensive,
    Supplier Name Paid Date FY Year      Sum  Rank Sum     Bin Rank Sum
 27   Joyce Green            FY2018  1526.16       5.0  Least Expensive
 28   Joyce Green            FY2019  9999.09       9.0  Least Expensive
 29   Joyce Green            FY2020   708.10       3.0  Least Expensive,
    Supplier Name Paid Date FY Year       Sum  Rank Sum     Bin Rank Sum
 30    Karen Tran            FY2018  23127.99      13.0   Less Expensive
 31    Karen Tran            FY2019  28490.21      17.0   Less Expensive
 32    Karen Tran            FY2020   7067.30       8.0  Least Expensive,
    Supplier Name Paid Date FY Year          Sum  Rank Sum    Bin Rank Sum
 33  Melissa Wang            FY2018  207494.8321      32.0  More Expensive
 34  Melissa Wang            FY2019  228311.6400      33.0  More Expensive
 35  Melissa Wang            FY2020   57821.3100      20.0  Less Expensive,
      Supplier Name Paid Date FY Year        Sum  Rank Sum    Bin Rank Sum
 36  Michael Nguyen            FY2018  140296.74      26.0         Average
 37  Michael Nguyen            FY2019  922189.38      42.0  Most Expensive
 38  Michael Nguyen            FY2020  552030.99      37.0  More Expensive,
                Supplier Name Paid Date FY Year        Sum  Rank Sum  
 39  Mrs. Teresa Thompson DDS            FY2018   90791.41      21.0   
 40  Mrs. Teresa Thompson DDS            FY2019  157290.15      30.0   
 41  Mrs. Teresa Thompson DDS            FY2020   40868.99      18.0   
 
       Bin Rank Sum  
 39  Less Expensive  
 40         Average  
 41  Less Expensive  ,
       Supplier Name Paid Date FY Year         Sum  Rank Sum    Bin Rank Sum
 42  Patrick Herrera            FY2018   661283.77      39.0  More Expensive
 43  Patrick Herrera            FY2019  2236597.92      47.0  Most Expensive
 44  Patrick Herrera            FY2020  1190359.61      44.0  Most Expensive,
    Supplier Name Paid Date FY Year        Sum  Rank Sum    Bin Rank Sum
 45   Rachel Odom            FY2018  824392.65      41.0  More Expensive
 46   Rachel Odom            FY2019  984224.09      43.0  Most Expensive
 47   Rachel Odom            FY2020  520067.29      36.0  More Expensive,
       Supplier Name Paid Date FY Year         Sum  Rank Sum    Bin Rank Sum
 48  Vincent Coleman            FY2018  1464104.11      46.0  Most Expensive
 49  Vincent Coleman            FY2019  3737305.47      51.0  Most Expensive
 50  Vincent Coleman            FY2020  2775609.73      48.0  Most Expensive]
 

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

1. Я также могу получить ранг и ячейку в виде таблицы groupby. Ошибка возникает при сохранении таблиц в рабочей книге.