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

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

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

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

Q&A

解決済

1回答

2527閲覧

2種類のデータフレームから一つのグラフで描写する方法ついて。

sham0909

総合スコア27

Python

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

0グッド

0クリップ

投稿2019/02/07 00:19

編集2019/02/07 01:55

お世話になります。

横軸が時間の場合にサンプリング幅が異なる2種類のデータフレームがあり、
時間の共通項部分だけ抜き出し、描写する方法についてご教示お願いいたします。

例えば、以下の2種類のデータフレームで共通の時間をx軸にしてy軸A,B,C,Dをプロットさせたいです。

データフレーム1

時間AB
0:00.00512
0:00.01024
0:00.01536
0:00.02048

データフレーム2

時間CD
0:00.01061
0:00.02073
0:00.03085
0:00.04097

現在は以下のデータフレーム3として共通の分を抜き出し、pandasのplot機能で描写をしているのですが
もっとスマートな方法がないものか質問させていただきました。

データフレーム3

時間ABCD
0:00.0102461
0:00.0204873

追記

コードは以下の通りです。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3 4df1=pd.DataFrame({"TIME":["00:00.005","00:00.010","00:00.015","00:00.020"],"A"["1","2","3","4"],"B":["2","4","6","8"]}) 5df1.index=df1["TIME"] 6df2=pd.DataFrame({"TIME":["00:00.010","00:00.020","00:00.030","00:00.040"],"C"["6","7","8","9"],"D":["1","3","5","7"]}) 7df2.index=df2["TIME"] 8df3=pd.concat([df1,df2],axis=1,join="inner") 9 10plt.plot(df3["TIME"],df3["A"],df3["B"]) 11plt.plot(df3["TIME"],df3["C"],df3["D"]) 12

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

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

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

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

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

can110

2019/02/07 00:25

その手順で基本的によいと思うのですが、スマートかどうか分からないので、現在のソースコードを提示ください。
sham0909

2019/02/07 01:59

返信ありがとうございました。本来はデータ量が多く計算時間が長いです。データフレーム結合して、共通部分を抜き出す行為が余計ではないかと思い、質問させていただきました。質問内容の手法が一般的であれば、このまま使っていきたいと思います。
can110

2019/02/07 02:11

> 共通部分を抜き出す行為が余計ではないかと思い 余計かどうかは質問者様の要件によるので第三者としては余計かどうかの判断はできないかと。 コードとしては自然で問題ないと思います。
sham0909

2019/02/07 03:32

ご指摘ありがとうございました。
guest

回答1

0

ベストアンサー

グラフをプロットする為に2つのデータフレームを結合する行為自体を余計な行為とは思いません。私自身もこのような処理をよく行います。

それよりも、時間カラムを文字列として扱ったままデータをプロットしていることの方が問題かと思います。時間カラムが文字列の場合、時間の間隔に関係なくデータが等間隔で並んでプロットされてしまいます。
今回の場合はpandas.to_datetime()formatパラメータを渡して
df1.index = pd.to_datetime(df1.index, format='%M:%S.%f')
のようにすることで df1 のIndexをDateTime型に変換できます。(df2も同様)

また、今回のように DateTime型のデータがIndexに指定されている場合、グラフの描画をワザワザ

Python

1plt.plot(df3["TIME"],df3["A"],df3["B"]) 2plt.plot(df3["TIME"],df3["C"],df3["D"])

のように記述しなくても

Python

1df3.plot()

とするだけでよいのでまとめると

import pandas as pd import matplotlib.pyplot as plt df1 = pd.DataFrame({ "TIME":["00:00.005","00:00.010","00:00.015","00:00.020"],"A":[1,2,3,4],"B":[2,4,6,8]}) df1 = df1.set_index('TIME') df1.index = pd.to_datetime(df1.index, format='%M:%S.%f') df2=pd.DataFrame({ "TIME":["00:00.010","00:00.020","00:00.030","00:00.040"],"C":[6,7,8,9],"D":[1,3,5,7]}) df2 = df2.set_index('TIME') df2.index = pd.to_datetime(df2.index, format='%M:%S.%f') pd.concat([df1,df2],axis=1,join="inner").plot()

のように書けるかと思います。(データの型やIndexの指定方法を若干修正しております)

あと最初に結合は問題ないと書きましたが、データがメモリを圧迫するくらい膨大でデータフレームのコピーを生成する余裕がないのであれば最後の箇所は 結合を止めて Maskを使って

Python

1df1[df1.index.isin(df2.index)].plot()

の方が良いかもしれませんね

投稿2019/02/07 03:28

magichan

総合スコア15898

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

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

sham0909

2019/02/07 03:47 編集

※同様の文を二重に投稿しました。本文は気にしないでください
sham0909

2019/02/07 03:42

返信ありがとうございました。 データフレーム結合が一般的なのですね。データフレーム結合せずとも2つのデータフレームから共通部だけぬきだして、グラフをプロットするみたいな手法はないものかと思い、色々検索してみましたが見当たらず当該質問をした次第です。 コードの指摘ありがとうございました。ご指摘内容を理解をして、今後に活かしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問