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

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

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

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

pandas

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

Q&A

解決済

3回答

1989閲覧

python pandas 近似値を使った横結合 の方法

icemanstanding

総合スコア73

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2022/01/26 16:18

ご指導をお願いします。

<手元のデータ>
dfa:住所、緯度_x、経度_x、2000行
dfb:緯度_y、経度_y、10行

<やりたいこと>
・dfbの(緯度_y、経度_y)に最も近いdfaの住所を、dfbに追加したい。

<困っている事>
・(緯度_y、経度_y)と(緯度_x、経度_x)は一致しない。
・(緯度_y、経度_y)→(緯度_x、経度_x)の最短距離1 と 
逆の (緯度_x、経度_x)→(緯度_y、経度_y)の最短距離2が何故か完全一致せず、
最短距離をキーにしてmergeが使えない。

<やった事>
・(緯度_y、経度_y)→(緯度_x、経度_x)の最短距離1 と 
逆の (緯度_x、経度_x)→(緯度_y、経度_y)の最短距離2を算出し、
最短距離をキーにしてmergeしてみた。
・.round(6)をつかって、有効桁数をdfaとdfbで合わせた。

<やった事>のコード a = dff_d[['緯度','経度']].values b=df[['緯度','経度']].values    #(緯度_y、経度_y)→(緯度_x、経度_x)の最短距離1を算出 dist = distance.cdist(a, b, metric='euclidean') Lmin = np.min(dist, axis=1) dff_d['最小距離']=Lmin    #(緯度_x、経度_x)→(緯度_y、経度_y)の最短距離2を算出 dist = distance.cdist(b a, metric='euclidean') Lmin = np.min(dist, axis=1) df['最小距離']=Lmin    #マージ dff_d=pd.merge(df,dff_d,how='left',on='最小距離')

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

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

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

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

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

tiitoi

2022/01/26 17:02

もう一方の DataFrame に距離が同じ行が複数ある場合はどのように紐付けるのでしょうか?
icemanstanding

2022/01/26 22:13

遅くにご回答ありがとうございました。 そのときは、経度差の小さい方を優先して残していました。 実際には、経度を範囲毎にfor文で回しているので、 同一経度範囲内で最短距離が6桁まで一致することはないと・・・・ 今、思うと楽観的でしたね。
guest

回答3

0

両方ともgeopandaのGeoDataFrameにしてsjoin_nearestを使うのはどうでしょう。

投稿2022/01/26 22:13

xail2222

総合スコア1497

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

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

0

ベストアンサー

位置参照情報 ダウンロードサービス から東京都の街区レベルの緯度・経度情報を入手してデータフレーム化してみました。

python

1print(dfa) 2 3# 4 住所 緯度 経度 50 東京都千代田区麹町六丁目1 35.684649 139.731373 61 東京都千代田区麹町六丁目5 35.684649 139.731373 72 東京都千代田区六番町6 35.687614 139.732787 83 東京都千代田区六番町8 35.687614 139.732787 94 東京都千代田区六番町10 35.687614 139.732787 10... ... ... ... 11273283 東京都小笠原村母島157 26.642729 142.161107 12273284 東京都小笠原村母島158 26.642729 142.161107 13273285 東京都小笠原村母島159 26.642729 142.161107 14273286 東京都小笠原村母島160 26.642729 142.161107 15273287 東京都小笠原村母島161 26.642729 142.161107 16 17[273288 rows x 3 columns]

dfbの(緯度_y、経度_y)に最も近いdfaの住所を、dfbに追加したい。

python

1import pandas as pd 2from scipy.spatial import distance 3 4dfb = pd.DataFrame( 5 [ 6 [35.6585840, 139.7454316], # 東京タワー 7 [35.7100069, 139.8108103], # 東京スカイツリー 8 [35.6842961, 139.8647716], # 船堀タワー(タワーホール船堀) 9 ], columns = ['緯度', '経度'] 10) 11 12idx = distance.cdist(dfa[['緯度', '経度']], dfb, metric='euclidean').argmin(axis=0) 13dfb['住所'] = dfa.loc[idx, '住所'].values 14 15print(dfb) 16 17# 18 緯度 経度 住所 190 35.658584 139.745432 東京都港区芝公園四丁目2 201 35.710007 139.810810 東京都墨田区押上一丁目1 212 35.684296 139.864772 東京都江戸川区船堀四丁目1

投稿2022/01/26 17:59

編集2022/01/26 18:08
melian

総合スコア19763

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

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

icemanstanding

2022/01/26 22:55

毎回、ありがとうございます。(特に今回は深夜に)
guest

0

以下のようにしてはどうでしょうか?

python

1import numpy as np 2import pandas as pd 3 4df1 = pd.DataFrame( 5 { 6 "Name": list("ABCDEFGHIJ"), 7 "X": np.random.randint(0, 255, 10), 8 "Y": np.random.randint(0, 255, 10), 9 } 10) 11 12 13df2 = pd.DataFrame( 14 { 15 "Name": list("abcdef"), 16 "X": np.random.randint(0, 255, 6), 17 "Y": np.random.randint(0, 255, 6), 18 } 19) 20 21loc1 = df1[["X", "Y"]].values 22loc2 = df2[["X", "Y"]].values 23 24# loc1 と loc2 のユークリッド距離を計算する。 25dist_matrix = np.linalg.norm(loc1[:, np.newaxis] - loc2, axis=-1) # 距離関数は緯度経度ならユークリッド距離以外に適宜差し替える 26 27# loc1 の行ごとに、距離が最短の loc2 の行のインデックスを求める。 28nearest_idx = np.argmin(dist_matrix, axis=1) 29 30# 横方向に結合する。 31df3 = pd.concat((df1, df2.iloc[nearest_idx].reset_index()), axis=1) 32print(df3)

投稿2022/01/26 17:25

編集2022/01/26 17:25
tiitoi

総合スコア21956

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

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

icemanstanding

2022/01/26 22:56

深夜にご対応いただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問