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

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

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

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

pandas

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

Q&A

解決済

1回答

6224閲覧

Python pandas で前年比を集計する方法

ABSS

総合スコア13

Python

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

pandas

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

0グッド

1クリップ

投稿2020/04/12 23:44

下記のような日付とキャンペーンといった時系列のデーターに対して、
前年数値を横並びにしてpythonのpandasで集計する方法がイメージつかずご教授頂けますでしょうか?

DataFrame加工前

日付キャンペーン費用
2020-01-01testA1000
2020-01-02testA1000
2019-01-01testA500
2019-01-02testA500
2020-01-01testB2000
2020-01-02testB2000
2019-01-01testB1000
2019-01-02testB1000

DataFrame加工後のイメージ

|日付|キャンペーン|費用|前年数|前年比|
|:--|:--:|--:|
|2020-01-01|testA|1000|500|200%|
|2020-01-02|testA|1000|500|200%|
|2020-01-01|testB|2000|1000|200%|
|2020-01-02|testB|2000|1000|200%|

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

DataFrame.pivot_table() を使用して

python

1df.pivot_table(index=[df.index.strftime('%m/%d'), 'キャンペーン'], 2 columns=df.index.year, values='費用')

のように処理することで

日付キャンペーン20192020
01/01testA5001000
01/01testB10002000
01/02testA5001000
01/02testB10002000

のようなデータフレームを得ることができますので、あとはご自由に加工するとよいかと思います。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pivot_table.html#pandas.DataFrame.pivot_table

とりあえず、以下に動作サンプルを書きましたので参考にしてください。

Python

1import pandas as pd 2import io 3 4data = """ 5日付,キャンペーン,費用 62020-01-01,testA,1000 72020-01-02,testA,1000 82019-01-01,testA,500 92019-01-02,testA,500 102020-01-01,testB,2000 112020-01-02,testB,2000 122019-01-01,testB,1000 132019-01-02,testB,1000 14""" 15 16df = pd.read_csv(io.StringIO(data), parse_dates=['日付'], index_col='日付') 17print(df) 18 19ret = df.pivot_table(index=[df.index.strftime('%m/%d'), 'キャンペーン'], 20 columns=df.index.year, values='費用').reset_index(level=1) 21 22ret = ret.rename(columns={2019:'前年費用', 2020:'費用'}) 23ret['前年比'] = ret['費用'] / ret['前年費用'] * 100 24print(ret) 25#日付 キャンペーン 前年費用 費用 前年比 26#01/01 testA 500 1000 200.0 27#01/01 testB 1000 2000 200.0 28#01/02 testA 500 1000 200.0 29#01/02 testB 1000 2000 200.0

投稿2020/04/13 01:45

magichan

総合スコア15898

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

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

ABSS

2020/04/13 07:16

迅速に回答頂きありがとうございます! なるほど・・・。いろいろ調べても全く思いつかなったのでとても助かりました
ABSS

2020/04/13 10:10

すみません。 日付でフィルターをかける時は、例えば下記ように実行してもエラーになってしまいます。 ret.query("日付==01/01") どのように条件フィルタをかけたらよいのか?ご教授頂けると助かります・・。
magichan

2020/04/13 10:29

結果から条件フィルタをかけるということでしょうか? その場合日付は indexとなっておりますので、 ret.query("index=='01/01'") でどうでしょうか。
ABSS

2020/04/13 10:32

イメージ通りできました・・。いつも本当にありがとうございます! とても助かりました
magichan

2020/04/13 10:33

書き忘れておりましたが、pivot_table を作成する段階で、日付データを datetime型から str型に変換しておりますので、問題あるようでしたら、再度 datetime型に変換してください。
ABSS

2020/04/13 10:37

はい、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問