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

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

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

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

Q&A

1回答

1049閲覧

python pandas 複数の列でデータの出力を行いたい

Tubasa1995

総合スコア83

Python

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

0グッド

0クリップ

投稿2021/10/20 09:33

編集2021/10/21 13:16

現在、下記のようなコードを書いています。

import pandas as pd measurement = pd.read_csv('uz_data.csv') #データの読み込み measurement['Time'] = pd.to_datetime(measurement['Time']) measurement['Uz'] = measurement['Uz'].astype(float) #空のデータフレームの作成 cols = ['1s', '1m','5m'] df = pd.DataFrame(index=[], columns=cols) average_1s = measurement.groupby(pd.Grouper(key="Time", freq="1S")).mean().dropna() print(average_1s) average_1s.to_csv('Uz_1s.csv') average_1m = measurement.groupby(pd.Grouper(key="Time", freq="1min")).mean().dropna() print(average_1m) average_1m.to_csv('Uz_1m.csv') average_5m = measurement.groupby(pd.Grouper(key="Time", freq="5min")).mean().dropna() print(average_5m) average_5m.to_csv('Uz_5m.csv') df = pd.concat([average_1s, average_1m,average_5m], axis=1, ignore_index=True) df.to_csv('test.csv')

uz_data.csvはダウンロードから入手できます。

ただ、このコードの問題として
average_1s

average_1m

average_5m
が下記のように出力されてしまいます。
イメージ説明
一番左の時間軸にすべてのデータがあわされて出力されるので、1分平均や5分平均などの値はかなり次の値が出てくるまでかなり隙間が生じています。あと、列名も0,1,2のようになっていますが、これも1s、1m、5mなどを出力したいです。

つまり、理想の出力の形は
イメージ説明
のような形式で出力したいです。

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

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

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

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

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

can110

2021/10/21 04:44

理想の(欲しい)出力結果を提示ください。 たとえば10分間のデータなら1分毎の10行+5分毎の2行の内容がそれぞれ別列に入り、計12行が縦につながったものになる感じでしょうか?
can110

2021/10/21 13:41

同一行に事なる時間の値を(無理やり)詰め込む感じでしょうか…
Tubasa1995

2021/10/21 13:43

そういうことになります。
Tubasa1995

2021/10/21 13:45

だた、単に詰め込むわけではなく、Timeの列も追加します。
can110

2021/10/21 13:49

うーん、それならそれぞれ別のデータフレームとして分けたほうがよいと思いますが… 「私ならこうする」という回答をしておきます。
guest

回答1

0

欲しい結果とは異なると思いますが、私なら以下のようにします。
同じ時刻の行の値は1行にまとめます。その方がのちの処理で扱いやすいと思うからです。
それに該当しない「隙間」の行の値は先頭(最初)の値をセットします。

Python

1import pandas as pd 2from datetime import datetime, timedelta 3 4# テストデータ 5times = [datetime(2021,10,12,8,30) + timedelta(minutes=i) for i in range(10)] 6df = pd.DataFrame({'Time':times, 'Uz':range(len(times))}) 7 8# 各時間間隔毎に集計。値の列名はその間隔を表す文字列をそのままセット 9dfs = [] 10for freq in ['1min', '2min', '3min']: 11 dfs.append( df.groupby(pd.Grouper(key="Time", freq=freq)).mean().dropna().rename(columns={'Uz':freq})) 12 13# 集計結果を同一時間にまとめて列方向に連結 14ret = pd.concat(dfs, axis=1) 15print(ret) 16""" 17 1min 2min 3min 18Time 192021-10-12 08:30:00 0.0 0.5 1.0 202021-10-12 08:31:00 1.0 NaN NaN 212021-10-12 08:32:00 2.0 2.5 NaN 222021-10-12 08:33:00 3.0 NaN 4.0 232021-10-12 08:34:00 4.0 4.5 NaN 242021-10-12 08:35:00 5.0 NaN NaN 252021-10-12 08:36:00 6.0 6.5 7.0 262021-10-12 08:37:00 7.0 NaN NaN 272021-10-12 08:38:00 8.0 8.5 NaN 282021-10-12 08:39:00 9.0 NaN 9.0 29""" 30 31# 時間軸に該当しない値は先頭行の値を採用 32ret = ret.fillna(method='ffill') 33print(ret) 34""" 35 1min 2min 3min 36Time 372021-10-12 08:30:00 0.0 0.5 1.0 382021-10-12 08:31:00 1.0 0.5 1.0 392021-10-12 08:32:00 2.0 2.5 1.0 402021-10-12 08:33:00 3.0 2.5 4.0 412021-10-12 08:34:00 4.0 4.5 4.0 422021-10-12 08:35:00 5.0 4.5 4.0 432021-10-12 08:36:00 6.0 6.5 7.0 442021-10-12 08:37:00 7.0 6.5 7.0 452021-10-12 08:38:00 8.0 8.5 7.0 462021-10-12 08:39:00 9.0 8.5 9.0 47"""

投稿2021/10/21 13:47

can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問