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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1572閲覧

2つのデータフレーム間で差分が最も小さい値(最も近い値)を抽出したい

k1ppa

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/08/03 08:47

データフレーム1

timeY
00.03
10.55
21.04
31.58
42.010
52.57

データフレーム2

timeZ
00.004
10.310
20.63
31.04
41.36
51.69
62.01
72.33
82.65
93.08
103.34
113.62

所望の出力

result

timeYZ
00.034(time差分0.1)
10.553(time差分0.1)
21.044(time差分0)
31.589(time差分0.1)
42.0101(time差分0)
52.575(time差分0.1)

*カッコ内は出力しなくてもよいです。

行いたい処理

・データフレーム1のtimeとデータフレーム2のtimeを参照する
・データフレーム1のtimeとデータフレーム2のtimeの差分が最も小さいZをデータフレーム1に追記する
・データフレーム1のデータ数が満たされた時点で処理終了(少ないデータ数に合わせる)

###試したこと
teratail内に私の質問内容に似た質問があり、そちらを参照したのですがうまくいきませんでした。
そこから手も足も出なく、どこから手をつければ良いか分からない状態です。
###一言
丸投げ状態の質問で大変申し訳ございません。
処理の手順等でも構いませんのでご教授いただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

pandas.merge_asofでできます。

Python

1import pandas as pd 2from io import StringIO 3 4s1 = """time Y 50.0 3 60.5 5 71.0 4 81.5 8 92.0 10 102.5 7""" 11 12s2 = """time Z 130.00 4 140.3 10 150.6 3 161.0 4 171.3 6 181.6 9 192.0 1 202.3 3 212.6 5 223.0 8 233.3 4 243.6 2""" 25 26df1 = pd.read_csv(StringIO(s1),sep='\t') 27df2 = pd.read_csv(StringIO(s2),sep='\t') 28 29df = pd.merge_asof(df1, df2, on='time', direction='nearest') 30print(df) 31""" 32 time Y Z 330 0.0 3 4 341 0.5 5 3 352 1.0 4 4 363 1.5 8 9 374 2.0 10 1 385 2.5 7 5 39"""

投稿2020/08/03 09:03

編集2020/08/03 09:05
can110

総合スコア38262

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

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

k1ppa

2020/08/03 10:15

素早い回答誠にありがとうございます。早速実装してみたいと思います!
k1ppa

2020/08/04 04:26

所望の出力を得ることが出来ました。誠にありがとうございました。
guest

0

一番最初のtime差分は0かと思います。

Python

1df3 = df1.copy() 2df3['Z'] = '' 3for i in range(len(df1)): 4 check_time_a = df1['time'][i] 5 tmp_min = 99999 6 for j in range(len(df2)): 7 check_time_b = df2['time'][j] 8 if np.abs(check_time_a - check_time_b) < tmp_min: 9 tmp_min_j = j 10 tmp_min = np.abs(check_time_a - check_time_b) 11 df3['Z'][i] = '{} (time差分{:.1f})'.format(df2['Z'][tmp_min_j], tmp_min) 12 13df3

小数点以下の引き算をすると丸め誤差が出るので、formatで小数点以下1桁までで丸めて下記な感じです

time Y Z 0 0.0 3 4 (time差分0.0) 1 0.5 5 3 (time差分0.1) 2 1.0 4 4 (time差分0.0) 3 1.5 8 9 (time差分0.1) 4 2.0 10 1 (time差分0.0) 5 2.5 7 5 (time差分0.1)

投稿2020/08/03 09:13

aokikenichi

総合スコア2218

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

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

k1ppa

2020/08/03 10:17

素早い回答誠にありがとうございます。ご指摘の通り一番最初の差分は0です。早速実装してみます!ありがとうございます。
k1ppa

2020/08/04 04:30

所望の出力を得ることが出来ました。しかし、処理時間が他の回答者様の提案の方が早かったため、ベストアンサーにすることが出来なかったことをご了承ください。素早いご対応誠にありがとうございました。
aokikenichi

2020/08/04 09:19

お恥ずかしい泥いの書いてしまいました お許しを
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問