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

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

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

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

pandas

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

Q&A

解決済

1回答

533閲覧

pythonのpandasで時系列データを読み込み、そのデータを元に前月データを新たな列として追加したい。

sakurako-san

総合スコア2

Python

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

pandas

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

0グッド

0クリップ

投稿2021/08/18 15:05

編集2021/08/18 15:18

前提・実現したいこと

pythonでpandasを使って下記データを読み込んでいます。

|日付|名前|点数|カウント
|:--|:--:|--:|
|2021-10-01|A|88|1
|2021-10-01|B|90|1
|2021-10-01|C|81|1
|2021-10-01|D|62|1
|2021-10-01|E|59|1
|2021-10-01|F|91|1
|2021-09-01|A|82|2
|2021-09-01|B|75|2
|2021-09-01|E|98|2
|2021-08-01|B|48|3
|2021-08-01|C|79|2
|2021-07-01|F|66|2
|2021-07-01|D|79|2
|2021-07-01|E|57|3
|2021-06-01|A|77|3
|2021-06-01|B|99|4
|2021-06-01|C|59|3
|2021-06-01|D|71|3
|2021-06-01|E|51|4

このデータを「名前」と「カウント」をキーにして下記のように列を追加したいです。
「日付2」:「カウント」に1を足して、「名前」と「カウントに1足した数字」が合致する行の「日付」。合致したデータなければ0。
「点数2」:「カウント」に1を足して、「名前」と「カウントに1足した数字」が合致する行の「点数」。合致したデータなければ0。
「日付3」:「カウント」に2を足して、「名前」と「カウントに2足した数字」が合致する行の「日付」。合致したデータなければ0。
「点数3」:「カウント」に2を足して、「名前」と「カウントに2足した数字」が合致する行の「点数」。合致したデータなければ0。
「日付4」:「カウント」に3を足して、「名前」と「カウントに3足した数字」が合致する行の「日付」。合致したデータなければ0。
「点数4」:「カウント」に3を足して、「名前」と「カウントに3足した数字」が合致する行の「点数」。合致したデータなければ0。

|日付|名前|点数|カウント|日付2|点数2|日付3|点数3|日付4|点数4
|:--|:--:|--:|
|2021-10-01|A|88|1|2021-09-01|82|2021-06-01|77|0|0
|2021-10-01|B|90|1|2021-09-01|75|2021-08-01|48|2021-06-01|99
|2021-10-01|C|81|1|2021-08-01|79|2021-06-01|59|0|0
|2021-10-01|D|62|1|2021-07-01|79|2021-06-01|71|0|0
|2021-10-01|E|59|1|2021-09-01|98|2021-07-01|57|2021-06-01|75
|2021-10-01|F|91|1|2021-07-01|66|0|0|0|0
|2021-09-01|A|82|2|2021-06-01|77|0|0|0|0
|2021-09-01|B|75|2|2021-08-01|48|2021-06-01|99|0|0
|2021-09-01|E|98|2|2021-07-01|57|2021-06-01|75|0|0
|2021-08-01|B|48|3|2021-06-01|99|0|0|0|0
|2021-08-01|C|79|2|2021-06-01|59|0|0|0|0
|2021-07-01|F|66|2|0|0|0|0|0|0
|2021-07-01|D|79|2|2021-06-01|71|0|0|0|0
|2021-07-01|E|57|3|2021-06-01|51|0|0|0|0
|2021-06-01|A|77|3|0|0|0|0|0|0
|2021-06-01|B|99|4|0|0|0|0|0|0
|2021-06-01|C|59|3|0|0|0|0|0|0
|2021-06-01|D|71|3|0|0|0|0|0|0
|2021-06-01|E|51|4|0|0|0|0|0|0

試したこと

当初はExcelで関数(Index関数、match関数)を使い配列数式で同じようなことをしていたのですが、めちゃくちゃ重くなるので、pythonでできないかと思い立って導入してみたのですが、思うように行かず悩んでいます。
カウント列はExcelの名残なので、必ず必要な列ではありません。

groupbyやlocなどを使えば良いのかな?と漠然と考えているだけで、知識が乏しすぎて何も書けない状況です。
丸投げで質問してしまって大変恐縮ですが、ぜひアドバイスを頂きたいです。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Windows10
python3.8.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

pandasのマージを使うのがわかりやすいでしょう。

python

1>>> print(df) 2 日付 名前 点数 カウント 30 2021-10-01 A 88 1 41 2021-10-01 B 90 1 52 2021-10-01 C 81 1 63 2021-10-01 D 62 1 74 2021-10-01 E 59 1 85 2021-10-01 F 91 1 96 2021-09-01 A 82 2 107 2021-09-01 B 75 2 118 2021-09-01 E 98 2 129 2021-08-01 B 48 3 1310 2021-08-01 C 79 2 1411 2021-07-01 F 66 2 1512 2021-07-01 D 79 2 1613 2021-07-01 E 57 3 1714 2021-06-01 A 77 3 1815 2021-06-01 B 99 4 1916 2021-06-01 C 59 3 2017 2021-06-01 D 71 3 2118 2021-06-01 E 51 4 22>>> df_result = df 23>>> for i in range(1, 4): 24... df_shift = df.copy() 25... df_shift['カウント'] -= i 26... df_shift.columns = [f'日付{i+1}', '名前', f'点数{i+1}', 'カウント'] 27... df_result = pd.merge(df_result, df_shift, how='left').fillna(0) 28... df_result[f'点数{i+1}'] = df_result[f'点数{i+1}'].astype(int) 29... 30>>> print(df_result) 31 日付 名前 点数 カウント 日付2 点数2 日付3 点数3 日付4 点数4 320 2021-10-01 A 88 1 2021-09-01 82 2021-06-01 77 0 0 331 2021-10-01 B 90 1 2021-09-01 75 2021-08-01 48 2021-06-01 99 342 2021-10-01 C 81 1 2021-08-01 79 2021-06-01 59 0 0 353 2021-10-01 D 62 1 2021-07-01 79 2021-06-01 71 0 0 364 2021-10-01 E 59 1 2021-09-01 98 2021-07-01 57 2021-06-01 51 375 2021-10-01 F 91 1 2021-07-01 66 0 0 0 0 386 2021-09-01 A 82 2 2021-06-01 77 0 0 0 0 397 2021-09-01 B 75 2 2021-08-01 48 2021-06-01 99 0 0 408 2021-09-01 E 98 2 2021-07-01 57 2021-06-01 51 0 0 419 2021-08-01 B 48 3 2021-06-01 99 0 0 0 0 4210 2021-08-01 C 79 2 2021-06-01 59 0 0 0 0 4311 2021-07-01 F 66 2 0 0 0 0 0 0 4412 2021-07-01 D 79 2 2021-06-01 71 0 0 0 0 4513 2021-07-01 E 57 3 2021-06-01 51 0 0 0 0 4614 2021-06-01 A 77 3 0 0 0 0 0 0 4715 2021-06-01 B 99 4 0 0 0 0 0 0 4816 2021-06-01 C 59 3 0 0 0 0 0 0 4917 2021-06-01 D 71 3 0 0 0 0 0 0 5018 2021-06-01 E 51 4 0 0 0 0 0 0

mergeの使い方については、pandas.DataFrameを結合するmerge, join(列・インデックス基準)をお読みください。

投稿2021/08/18 16:27

ppaul

総合スコア24666

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

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

sakurako-san

2021/08/19 02:10

ありがとうございます!! 思い通りの表ができて感激しています! mergeは確かに書籍で見たことあるような…、レベルで全然使ったこともなかったので、今回の教えていただいたコードをよく読み込んで勉強させていただきます! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問