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

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

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

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

Q&A

解決済

2回答

1354閲覧

Pythonでのデータの集計

ok_

総合スコア8

Python

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

0グッド

0クリップ

投稿2018/07/19 14:06

前提・実現したいこと

以下のようなログデータをPythonで読み込み、指定期間(1秒、5秒、10秒など)で集計したいです。
単にdataAの合計値などであれば「resample」で実現できることを教えていただいたのですが
指定期間(例えば1秒間)で、typeが[UP]になっているログのdataAの合計値や平均値
typeが[DN]になっているログのdataAの合計値や平均値
といった条件付きの集計を行いたいです。
ループで回しながら行う方法しか思いつきませんでした。
良い方法があれば教えていただきたいです。
よろしくお願いします。

====ログ(log.csv)====
date,dataA,type
2018-07-01 12:01:01.05236, 9863, 'UP'
2018-07-01 13:01:01.12761, 1005, 'DN'
2018-07-01 13:01:01.22165, 1211, 'DN'
2018-07-01 15:01:44.72161, 2254, 'UP'
2018-07-01 16:01:52.56281, 3816, 'DN'

====出力イメージ====
date, UP_sum, UP_avg, DN_sum, DN_avg
2018-07-01 12:01:01, 9863, 9863, 2216, 1108

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

Python 3.X

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

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

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

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

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

guest

回答2

0

とりあえずデータフレームにできたとして、

python

1df[df["type"] == "UP"]

でtypeが"UP"のものだけ取り出して新しいデータフレームを作れますから、それに対してresampleかければ良いでしょう。

投稿2018/07/19 15:53

hayataka2049

総合スコア30933

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

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

0

ベストアンサー

DataFrame.resample().apply() を使用して出力イメージに合う行データを生成すると良いかと思います。
以下は動作サンプル

Python

1import pandas as pd 2import io 3 4data = """ 5date,dataA,type 62018-07-01 12:01:01.05236, 9863, 'UP' 72018-07-01 13:01:01.12761, 1005, 'DN' 82018-07-01 13:01:01.22165, 1211, 'DN' 92018-07-01 15:01:44.72161, 2254, 'UP' 102018-07-01 16:01:52.56281, 3816, 'DN' 11""" 12 13 14df = pd.read_csv(io.StringIO(data), 15 parse_dates=['date'], 16 index_col='date', 17 quotechar = "'", 18 skipinitialspace = True ) 19 20# 生成したい行データをSeries型で返す関数 21def f(d): 22 new_row = pd.Series() 23 new_row.at['UP_sum'] = d.loc[d.type == 'UP', 'dataA'].sum() 24 new_row.at['UP_avg'] = d.loc[d.type == 'UP', 'dataA'].mean() 25 new_row.at['DN_sum'] = d.loc[d.type == 'DN', 'dataA'].sum() 26 new_row.at['DN_avg'] = d.loc[d.type == 'DN', 'dataA'].mean() 27 return new_row 28 29yy = df.resample('1H').apply(f) 30print(yy) 31# UP_sum UP_avg DN_sum DN_avg 32#date 33#2018-07-01 12:00:00 9863.0 9863.0 0.0 NaN 34#2018-07-01 13:00:00 0.0 NaN 2216.0 1108.0 35#2018-07-01 14:00:00 0.0 NaN 0.0 NaN 36#2018-07-01 15:00:00 2254.0 2254.0 0.0 NaN 37#2018-07-01 16:00:00 0.0 NaN 3816.0 3816.0

投稿2018/07/19 23:52

magichan

総合スコア15898

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

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

ok_

2018/07/20 11:55

DataFrameに対して自作関数を適用できるのですね。 勉強になりました。 具体的な回答をありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問