🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

964閲覧

[Python3]Excel表から指定された複数の数値を合計する方法

MM921

総合スコア14

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2021/01/13 00:12

前提・実現したいこと

今回実現したいことは以下のリンク内容の派生です。
[Python3]Excel表から指定された複数の数値の中から最小の数をセルに書き込みたい

python3.8でExcelの出庫履歴表から日に合計何個消費したかを表す統計表を作ろうとしています。
リンク内容と類似しますが,今回は複数の指定された数値の合計を計算してその合計をセルに書き込みたいです。

↓出庫履歴の表.xlsx

備品名備品個数消費個数日付
fff26612021-01-12
eee26222021-01-12
ddd26212021-01-12
ccc22612021-01-12
bbb22812021-01-12
aaa14912021-01-12
fff26722021-01-12
eee26412021-01-12
ddd26412021-01-12
ccc29912021-01-12
bbb29912021-01-12
aaa29822021-01-12
fff26912021-01-08
eee26512021-01-08
ddd26512021-01-08
ccc22712021-01-08
bbb22922021-01-08
aaa15012021-01-08
fff27012021-01-08
eee26622021-01-08
ddd26612021-01-08
ccc22822021-01-08
bbb23122021-01-08
aaa15112021-01-08
fff27112021-01-08
eee26822021-01-08
ddd26812021-01-08
ccc23022021-01-08
bbb23312021-01-08
aaa15222021-01-08
fff27212021-01-07
eee27012021-01-07
ddd27012021-01-07
ccc23212021-01-07
bbb23412021-01-07
aaa15412021-01-07
fff27312021-01-07
eee27122021-01-07
ddd27112021-01-07
ccc23312021-01-07
bbb23512021-01-07
aaa15512021-01-07
aaa15622021-01-07

例:aaaの総消費個数は
1+2+1+1+2+1+1+2=11個
このように備品ごとの総消費個数を求めたいです。

発生している問題・エラーメッセージ

print(sum())の括弧内に何を入れたらA及びaaaの合計消費個数が計算されるのか,またsumかdictを使うべきなのかと考えましたが自分なりに調べてもわかりませんでした。

以下はエラーコードです。

Traceback (most recent call last): File "C:/Users/xxxx/PycharmProjects/sample2Project/統計表書き込み.py", line 37, in <module> print(sum()) TypeError: sum() takes at least 1 positional argument (0 given)

該当のソースコード

import openpyxl book = openpyxl.load_workbook('出庫履歴の表.xlsx') sheet = book["Sheet1"] B2_COL = 1 B8_ROW = 1 E2_COL = 6 E6_ROW = 44 A = 'aaa' B = 'bbb' C = 'ccc' D = 'ddd' E = 'eee' F = 'fff' G = 'ggg' H = 'hhh' I = 'iii' J = 'jjj' K = 'kkk' L = 'lll' M = 'mmm' number_dic = {A, B, C, D, E, F, G, H, I, J, K, L, M} for row in sheet.iter_rows(min_col=B2_COL, min_row=B8_ROW, max_col=E2_COL, max_row=E6_ROW): for cell in row: # 該当セルの値取得 cell_value = cell.value o = cell.offset(0, 2) offset = o.value # セル範囲内に該当の文字列が存在する場合表示 if str(A) in str(cell_value): print(sum())

試したこと

print(sum())の括弧内にoffsetやnumber_dic[A]などを入れるとタイプエラーが起きました。
Pythonをはじめて日は浅く,知識不足ゆえ何卒ご教示お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

excelを読み込んで集計したいときは、openpyxlよりpandasのほうが便利じゃないかと思います。
たとえば下記のように書けます。

python3

1import pandas as pd 2 3df = pd.read_excel('出庫履歴の表.xlsx') 4print(df.groupby("備品名").sum()) # groupby("備品名")で備品名ごとグループ化して、sum()でその合計を取得 5# 備品個数 消費個数 6# 備品名 7# aaa 1365 11 8# bbb 1689 9 9# ccc 1675 9 10# ddd 1866 7 11# eee 1866 11 12# fff 1888 8

追記

以下は、aaaの合計個数のprint方法と、excelへの書き込み(既存ブックへの追記なのでopenpyxlを使用)例です。元のExcelにsumシートが増えているはずなので見てみてください。

python3

1import pandas as pd 2import openpyxl 3path = '出庫履歴の表.xlsx' 4df = pd.read_excel(path) 5df_g = df.groupby("備品名").sum() # groupby("備品名")で備品名ごとグループ化して、sum()でその合計を取得 6print(df_g["備品個数"]["aaa"]) # -> 1365 7 8with pd.ExcelWriter(path) as writer: 9 writer.book = openpyxl.load_workbook(path) 10 df_g.to_excel(writer, sheet_name='sum')

投稿2021/01/13 00:44

編集2021/01/13 02:53
jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MM921

2021/01/13 02:00

jeanbiegoさんご回答ありがとうございます。 なるほど,この場合はopenpyxlよりもpandasを利用したほうが便利なんですね! ご提案いただいたコードで試すと,備品個数と消費個数の合計がprint表示することができました。 以下は加えての質問ですが,お時間があるときに見ていただければ幸いです。 aaaの合計消費個数のみを表示したいときは以下の部分をどのように使えばいいのでしょうか?またそれをexcelのセルにあてはめることは可能でしょうか? >df.groupby("備品名").sum()
MM921

2021/01/13 04:19

わかりやすい追記,返信ともにありがとうございます。 追記内容とご紹介いただいたHPを参考に試してみたいと思います! 貴重なお時間をいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問