前提・実現したいこと
▪フォルダ内にある複数の.xlsxファイルに対して同じ処理を行いたい。
(プログラミングを初めて2週間の初心者です。初めて質問を投稿するため、質問の仕方が悪いかもしれませんがよろしくお願いいたします。)
現在会社の業務の効率化のために、半期ごとの売上実績のデータから製品の型名ごとに合計数量をまとめて、"元データ名_集計"という名前の.xlsxファイルを生成するというプログラミングを書いています。
現在は元データおよび生成されるデータのファイルパスは.pyファイルと同じ場所に指定しており、処理を行う.xlsxファイルの指定は、input()を使用し、元データ名を記入させるという方法を取っています。
しかし、これでは1件ずつしか処理が行えないことに加え、元データ名の記入ミス等が発生すると考えています。
そのため、以下の内容を実現したいです。
・フォルダ内にあるすべての.xlsxファイルについて同様の処理を行いたい。
・生成前データフォルダ、生成後データフォルダをそれぞれ作り、生成前データフォルダに格納した.xlsxファイルすべてに対して処理を行ったものを生成後データフォルダに保存したい。
・生成後のデータは"元データ名_集計.xlsx"という名前にしたい。
発生している問題・エラーメッセージ
まだ、なにもコーディングを行えていないため、エラーメッセージもありません。
該当のソースコード
import pandas as pd import openpyxl as px in_filepath_wo_extention = "./" + input("今回集計したいファイルのファイル名(拡張子抜き)を入れてください。(例:73上_HC_実績)") in_filepath = in_filepath_wo_extention + '.xlsx' out_filepath = in_filepath_wo_extention + '_集計.xlsx' #元データからデータフレームの読み込み df = pd.read_excel(in_filepath) #小分類の列から型名ごとにデータを抽出 get_v3 = df.query('小分類.str.contains("C13440-20CU")', engine='python') get_fusion = df.query('小分類.str.contains("C14440-20UP")', engine='python') get_fusionbt = df.query('小分類.str.contains("C15440-20UP")', engine='python') get_spark = df.query('小分類.str.contains("C11440-36U")', engine='python') get_lightning = df.query('小分類.str.contains("C14120")', engine='python') get_42U30 = df.query('小分類.str.contains("C11440-42U30")', engine='python') get_52U30 = df.query('小分類.str.contains("C11440-52U30")', engine='python') get_vga = df.query('小分類.str.contains("C12741-03")', engine='python') get_qvga = df.query('小分類.str.contains("C14041-10")', engine='python') get_imagem = df.query('小分類.str.contains("C9100-23B")', engine='python') get_imagem1k = df.query('小分類.str.contains("C9100-24B")', engine='python') get_gemini = df.query('小分類.str.contains("A12801-01")', engine='python') get_gemini2c = df.query('小分類.str.contains("A12801-10")', engine='python') #型名ごとに別シートに転記 with pd.ExcelWriter(out_filepath) as writer: get_v3.to_excel(writer, sheet_name="C13440-20CU") get_fusion.to_excel(writer, sheet_name="C14440-20UP") get_fusionbt.to_excel(writer, sheet_name="C15440-20UP") get_spark.to_excel(writer, sheet_name="C11440-36U") get_lightning.to_excel(writer, sheet_name="C14120-20P") get_42U30.to_excel(writer, sheet_name="C11440-42U30") get_52U30.to_excel(writer, sheet_name="C11440-52U30") get_vga.to_excel(writer, sheet_name="C12741-03") get_qvga.to_excel(writer, sheet_name="C14041-10U") get_imagem.to_excel(writer, sheet_name="C9100-23B") get_imagem1k.to_excel(writer, sheet_name="C9100-24B") get_gemini.to_excel(writer, sheet_name="A12801-01") get_gemini2c.to_excel(writer, sheet_name="A12801-10") wb = px.load_workbook(filename = out_filepath) wb.create_sheet("集計", 0) sheet1 = wb["集計"] #「集計」シートに以下の内容を記入 sheet1["B1"] = "型名" sheet1["C1"] = "数量" sheet1["B2"] = "C13440-20CU" sheet1["B3"] = "C14440-20UP" sheet1["B4"] = "C15440-20UP" sheet1["B5"] = "C11440-36U" sheet1["B6"] = "C14120-20P" sheet1["B7"] = "C11440-42U30" sheet1["B8"] = "C11440-52U30" sheet1["B9"] = "C12741-03" sheet1["B10"] = "C14041-10U" sheet1["B11"] = "C9100-23B" sheet1["B12"] = "C9100-24B" sheet1["B13"] = "A12801-01" sheet1["B14"] = "A12801-10" # 各型名の販売数量の合計値を「集計」シートに記入 sheet1["C2"] = sum(get_v3.数量) sheet1["C3"] = sum(get_fusion.数量) sheet1["C4"] = sum(get_fusionbt.数量) sheet1["C5"] = sum(get_spark.数量) sheet1["C6"] = sum(get_lightning.数量) sheet1["C7"] = sum(get_42U30.数量) sheet1["C8"] = sum(get_52U30.数量) sheet1["C9"] = sum(get_vga.数量) sheet1["C10"] = sum(get_qvga.数量) sheet1["C11"] = sum(get_imagem.数量) sheet1["C12"] = sum(get_imagem1k.数量) sheet1["C13"] = sum(get_gemini.数量) sheet1["C14"] = sum(get_gemini2c.数量) #上記の処理を行ったデータを保存 wb.save(out_filepath) wb.close()
試したこと
https://watlab-blog.com/2019/07/29/bundle-resize/
こちらの方の記事を参考にしようと試みましたが、処理内容の複雑さが違ったためfor文内にどのように処理を入れればよいかが分からず困っています。
globを使用して、フォルダ内のデータをまとめて読み込むというところまでは理解できたつもりですが、その後読み込んだファイル1つ1つに同じ処理を適用する部分のコーディングの仕方が分からない状況です。
補足情報(FW/ツールのバージョンなど)
pythonのバージョンは3.8.6です。
上記の他にどのような情報を提供すればよいかもわかっていない状況のため、必要な情報があればお申し付けいただけますと幸いです。
何卒よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー