質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

2回答

1471閲覧

python openpyxl 分類毎の合計を出したい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2022/02/14 12:08

Pythonのopenpyxlを使って種類毎の合計を出したいと思ってます。

下記のようなExcelの表があるとして、種類ごとの個数の合計を出したいです。
種類 金額
りんご 1
りんご 1
みかん 1
みかん 1
ぶどう 1
ぶどう 1
柿   1
柿    1
いちご 1
いちご 1
メロン 1
メロン 1
すいか 1
すいか 1
レモン 1
レモン 1
個数 りんご:2  みかん:2・・・

自分で考えて書いたコードが下記となります。
wb = openpyxl.load_workbook(ファイルの絶対パス)
ws = wb[Sheet1]

SUM = 0

List=["りんご”,"みかん,"ぶどう”,"柿”,"いちご”,"メロン”,"すいか”]

for i in List:
if ws.cell(row=i,column=1)==List
for j in range(2:ws.max_row):
SUM=sum+j

すみません、行き詰ってしまいましたのでどなたか教えていただければと思います。 

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

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

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

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

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

melian

2022/02/14 12:17

Pandas の read_excel を使ってデータフレーム化してみてはどうですか。
退会済みユーザー

退会済みユーザー

2022/02/14 12:25

pandasではうまくいきました!for i, group in df.groupby("種類"): openpyxlの知識を増やしたくて・・・
melian

2022/02/14 12:31

なるほど、了解です。
takasima20

2022/02/14 12:33

Excel からデータを取り出す処理と集計する処理を分けて考えてみては?
guest

回答2

0

ベストアンサー

Excel の Formula(計算式)を使う方法もあります(Excel ファイルに保存する必要がありますけれども)。

python

1import openpyxl 2 3wb = openpyxl.load_workbook('test.xlsx') 4ws = wb['Sheet1'] 5 6# sum by groups 7max_row = ws.max_row 8row_sum = max_row + 2 9col = 66 10ws[f'A{row_sum}'] = '個数' 11for i in range(2, ws.max_row): 12 if ws[f'A{i}'].value == ws[f'A{i-1}'].value: 13 ws[f'{chr(col)}{row_sum}'] = f'=CONCATENATE(A{i},":",SUMIF(A:A,A{i},B:B))' 14 col += 1 15 16# save 17wb.save('test_sums.xlsx')

test_sums.xlsx
イメージ説明

追記

python

1import openpyxl 2from collections import defaultdict 3from pprint import pprint 4 5wb = openpyxl.load_workbook('test.xlsx') 6ws = wb['Sheet1'] 7 8item_counts = defaultdict(int) 9for i, j in ws[f'A2:B{ws.max_row}']: 10 item_counts[i.value] += j.value 11item_counts = dict(item_counts) 12 13pprint(item_counts, width=20, sort_dicts=False) 14 15# 16{'りんご': 2, 17 'みかん': 2, 18 'ぶどう': 2, 19 '柿': 2, 20 'いちご': 2, 21 'メロン': 2, 22 'すいか': 2, 23 'レモン': 2}

投稿2022/02/14 15:20

編集2022/02/15 01:44
melian

総合スコア19705

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

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

0

openpyxlでやるなら以下です。

Python

1import openpyxl 2wb = openpyxl.load_workbook('fruit.xlsx') 3ws=wb['Sheet1'] 4 5result = {} 6for i in range(2, ws.max_row): 7 v = ws.cell(i, 1).value 8 if not v in result: 9 result[v] = 1 10 else: 11 result[v] += 1 12 13print(result)

pandasを使うなら以下です。

Pythonimport

1df = pd.read_excel('fruit.xlsx') 2result = df.groupby('種類').sum() 3print(result)

投稿2022/02/14 12:43

ppaul

総合スコア24666

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

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

退会済みユーザー

退会済みユーザー

2022/02/14 14:11

ありがとうございます!ただ、上の通りコードを書いたところ、TypeError: string indices must be integers のエラーが出てしまいました・・調査した結果、eval()を使うようなのですがどこに使えばよいかわからず、大変申し訳ないですが教えていただけますか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問