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

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

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

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

pandas

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

Q&A

解決済

1回答

2132閲覧

グループ化した各グループに対して、grouperとinterpolateを適用したい

kani_miso

総合スコア6

Python

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

pandas

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

0グッド

0クリップ

投稿2020/03/02 11:18

編集2020/03/02 18:51

前提・実現したいこと

pandasでgroupbyした各グループ内のデータだけに5分間隔グルーピングを行い、かつパディングしたデータを前後平均で補完したいです。
grouperとinterpolateを組み合わせればできそうだとは思っているものの、組み合わせ方がわからずお知恵をお借りできれば幸いです。

実現したいこと

具体的には以下の処理を行いたいです。
・dateとIDでgroupby
・groupbyしたグループ内のデータに対し、datetimeを5分間隔で周期的にグルーピング
・パディングされた行に対しては、前後平均でvalueの値を埋める

データフレームのイメージは以下です。

■元のデータフレーム

dateIDdatetimevalue
2020/2/112020/2/1 9:30:003
2020/2/112020/2/1 9:35:0012
2020/2/112020/2/1 9:50:006
2020/2/122020/2/1 9:25:0030
2020/2/122020/2/1 9:35:0020
2020/2/122020/2/1 9:40:0025
2020/2/212020/2/2 9:30:003
2020/2/222020/2/2 16:00:005
2020/2/222020/2/2 16:10:0012

■欲しいデータフレーム(太字が前後平均でパディングされた行)

dateIDdatetimevalue
2020/2/112020/2/1 9:30:003
2020/2/112020/2/1 9:35:0012
2020/2/112020/2/1 9:40:0010
2020/2/112020/2/1 9:45:008
2020/2/112020/2/1 9:50:006
2020/2/122020/2/1 9:25:0030
2020/2/122020/2/1 9:30:0025
2020/2/122020/2/1 9:35:0020
2020/2/122020/2/1 9:40:0025
2020/2/212020/2/2 9:30:003
2020/2/222020/2/2 16:00:005
2020/2/222020/2/1 16:05:008.5
2020/2/222020/2/2 16:10:0012

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

内容を見る限り行いたいことは、グループ化ではなく、resample()なのかと思います。

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

処理自体は、ID毎、日付毎に行いたいようですので、その部分はグループ化をつかって Groupby.resample()にて

Python

1df.set_index('datetime', drop=True).groupby(['date','ID'])['value'].resample('5Min').interpolate()

のように記述すると良いかと思います。

とここまで書きましたが実際に動作させてみるとエラーが出ました・・

エラーを解析するのが面倒だったので(すみません)、とりあえず groupby().apply() での実装に変えましたら動作しましたので、そのコードを貼っておきます。
(とりあえずこちらの実装でも問題ないかと思います。)

Python

1import pandas as pd 2import io 3 4data = """ 5date,ID,datetime,value 62020/2/1,1,2020/2/1 9:30:00,3 72020/2/1,1,2020/2/1 9:35:00,12 82020/2/1,1,2020/2/1 9:50:00,6 92020/2/1,2,2020/2/1 9:25:00,30 102020/2/1,2,2020/2/1 9:35:00,20 112020/2/1,2,2020/2/1 9:40:00,25 122020/2/2,1,2020/2/1 9:30:00,3 132020/2/2,2,2020/2/1 16:00:00,5 142020/2/2,2,2020/2/1 16:10:00,12 15""" 16 17df = pd.read_csv(io.StringIO(data), parse_dates=['date', 'datetime']) 18print(df) 19 20ret = df.set_index('datetime', drop=True).groupby(['date','ID'])['value'].apply(lambda d: d.resample('5Min').interpolate()).reset_index() 21print(ret) 22# date ID datetime value 23#0 2020-02-01 1 2020-02-01 09:30:00 3.0 24#1 2020-02-01 1 2020-02-01 09:35:00 12.0 25#2 2020-02-01 1 2020-02-01 09:40:00 10.0 26#3 2020-02-01 1 2020-02-01 09:45:00 8.0 27#4 2020-02-01 1 2020-02-01 09:50:00 6.0 28#5 2020-02-01 2 2020-02-01 09:25:00 30.0 29#6 2020-02-01 2 2020-02-01 09:30:00 25.0 30#7 2020-02-01 2 2020-02-01 09:35:00 20.0 31#8 2020-02-01 2 2020-02-01 09:40:00 25.0 32#9 2020-02-02 1 2020-02-01 09:30:00 3.0 33#10 2020-02-02 2 2020-02-01 16:00:00 5.0 34#11 2020-02-02 2 2020-02-01 16:05:00 8.5 35#12 2020-02-02 2 2020-02-01 16:10:00 12.0

投稿2020/03/02 23:18

magichan

総合スコア15898

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

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

kani_miso

2020/03/04 01:48

お返事が遅くなりまして申し訳ありません。 resample()で実現できるのですね…勉強になりました。 grouperとの組み合わせがうまくいかずにはまっていたので、大変助かりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問