🎄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による文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

513閲覧

[Python3]Excel表の中からfilterで取り出したものを日付別にして個数を合計したい

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による文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/01/14 06:54

前提・実現したいこと

python3.8でExcelの出庫履歴表から日に合計何個消費したかを表す統計表を作ろうとしていて,最終的に備品一つ一つの使用状況を日ごとにまとめたいと考えています。

現在データを備品の種類ごとにfilterで取り出すまではできましたが,そのデータを更に日付別に分けて同じ日付の消費個数を計算するところで滞っています。

python初心者のため,お力を貸していただければ幸いです。

↓出庫履歴の表.xlsx

備品名備品個数消費個数日付
fff26512021-01-13
eee26112021-01-13
ddd26112021-01-13
ccc22512021-01-13
bbb22712021-01-13
aaa14812021-01-13
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だけを取り出すことはできますが,その中で日付ごとに分けることができません。
出庫履歴の表.xlsxは実際に別プログラムを実行したときに履歴を随時上から追記するという表のため,明確な日付を定義してグループ分けすることができません。

日付が更新されていく場合のグループ分けの方法を調べてもわかりませんでした。

terminal

1 備品名 備品個数 消費個数 日付 25 aaa 148 1 2021-01-13 311 aaa 149 1 2021-01-12 417 aaa 298 2 2021-01-12 523 aaa 150 1 2021-01-08 629 aaa 151 1 2021-01-08 735 aaa 152 2 2021-01-08 841 aaa 154 1 2021-01-07 947 aaa 155 1 2021-01-07 1048 aaa 156 2 2021-01-07

該当のソースコード

import pandas as pd df = pd.read_excel('出庫履歴の表.xlsx', sheet_name='Sheet1') filter_contents = df['備品名'].values == 'aaa' print(df[filter_contents])

試したこと

以下のように条件分岐を使おうとしましたが,日付指定が難しいためできませんでした。

if 条件式A(備品名が等しい) & 条件式B(日付が等しい)

Pythonをはじめて日は浅く,知識不足ゆえお手柔らかにご教示お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

groupby を使いましょう。

Python

1df[df['備品名'].values == 'aaa'].gropuby(['日付']).sum().drop('備蓄個数')

とすることで 備品名 の日付ごとの合計がでます。

消費個数 日付 2021-01-07 15 ...

備品名ごとに一気にグループ化したければ

Python

1df.gropuby(['備品名', '日付']).sum().drop('備蓄個数')

と複数指定することも出来ます。

投稿2021/01/14 07:36

A_kirisaki

総合スコア2853

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

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

MM921

2021/01/14 08:05

A_kirisakiさん,ご回答ありがとうございます。 groupbyを使用したらグループ化できるのですね,勉強になりました。 ご提案くださったコードを自分用に改編して試してみたところ,以下のようなエラーが出てしまいました・・・ Traceback (most recent call last): File "C:/Users/xxxx/PycharmProjects/sample2Project/統計表書き込み.py", line 4, in <module> print(df[df['備品名'].values == 'aaa'].groupby(['日付']).sum().drop('消費個数')) File "C:\Users\xxxx\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\frame.py", line 4167, in drop return super().drop( File "C:\Users\xxxx\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 3887, in drop obj = obj._drop_axis(labels, axis, level=level, errors=errors) File "C:\Users\xxxx\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\generic.py", line 3921, in _drop_axis new_axis = axis.drop(labels, errors=errors) File "C:\Users\xxxx\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\indexes\base.py", line 5284, in drop raise KeyError(f"{labels[mask]} not found in axis") KeyError: "['消費個数'] not found in axis" ちなみに実行したコードは以下の通りです。 >import pandas as pd df = pd.read_excel('出庫履歴の表.xlsx', sheet_name='Sheet1') print(df[df['備品名'].values == 'aaa'].groupby(['日付']).sum().drop('消費個数')) この場合はどのように直したらよいでしょうか。 お時間のある時にお手数をかけますが再度見ていただけると幸いです。
A_kirisaki

2021/01/14 08:14

ああ、drop するなら drop('消費個数', axis=1) 必要でした、申し訳ない。あと消費個数 drop しちゃうと目的のもの消えちゃうので drop するなら備品個数ですかね。もしくは drop しないとか。
MM921

2021/01/18 01:27 編集

返信が遅れてしまい,申し訳ありません。 (なお,諸事情でこの返信を編集しましたがどうかお気になさらないでくださいませ。) >drop('備品個数', axis=1) で試してみたところ,日付別で合計消費個数が表示ができるようになりました! >あと消費個数 drop しちゃうと目的のもの消えちゃうので drop するなら備品個数ですかね。 dropについてよくわかっていなかったのでわかりやすいご説明感謝します。 以下は実際に実行したコードです。 import pandas as pd import openpyxl as px df = pd.read_excel('出庫履歴の表.xlsx', sheet_name='Sheet1') Aall = df[df['備品名'].values == 'aaa'].groupby(['日付']).sum().drop(['備品個数'], axis=1) print(Aall) 以下は実行画面です。 消費個数 日付 2021-01-07 4 2021-01-08 4 2021-01-12 3 2021-01-13 1 今回貴重なお時間を頂き,ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問