列値のペア間の最も近い一致に基づいて2つのデータフレームをマージします

スザンヌ

列値のペア間の一致に基づいて2つのデータフレームをマージしようとしています。ただし、列の値は、あるデータフレームから次のデータフレームまで正確ではありません。ペアはスイス座標系を使用した座標ですが、各dfのわずかに異なる基準点から測定されます。

このstackoverflowスレッドパンダの2つの異なるデータフレームの2点間の距離を見つける方法は?関連するクエリのようですが、残念ながら私は応答を完全には理解していません。

私のデータの例:

df1 = pd.DataFrame({'Ecode': [2669827.294, 2669634.483, 2669766.266, 2669960.683],
                    'Ncode': [1261034.528, 1262412.587, 1261209.646, 1262550.374],
                    'shape': ['square', 'square', 'triangle', 'circle']})

df1
     Ecode            Ncode          shape
0   2669827.294     1261034.528     square
1   2669634.483     1262412.587     square
2   2669766.266     1261209.646     triangle
3   2669960.683     1262550.374     circle


df2 = pd.DataFrame({'CoorE': [2669636, 2669765, 2669827, 2669961],
                    'CoorN': [1262413, 1261211, 1261032, 1262550],
                    'color': ['purple', 'blue', 'blue', 'yellow']})

df2
     CoorE       CoorN      color
0   2669636     1262413     purple
1   2669765     1261211     blue
2   2669827     1261032     blue
3   2669961     1262550     yellow

比較したいデータが両方の座標セット(例:「形状」と「色」)にあります。私の希望する結果は、最も近い一致の列ペアと一致します。

     CoorE       CoorN      color   shape
0   2669636     1262413     purple  square
1   2669765     1261211     blue    triangle
2   2669827     1261032     blue    square
3   2669961     1262550     yellow  circle

これを行う方法はありますか?merge_asofを使用しようとしましたが、2つの変数をキー入力できないことに気付きました。緯度と経度に基づいてこれを計算するスレッドも見ました。CoorE / CoorNとEcode / Ncodeをx / y座標として扱い、座標のペア間の距離を計算する関数を作成できます(おそらくより良い方法がありますが、これは初めてです)。

import math  
def calculateDistance(x1,y1,x2,y2):  
     dist = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)  
     return dist  
print calculateDistance(x1, y1, x2, y2)

またはこのようなものですが、この種の関数を使用して、最小距離に基づいて2つの別々のデータフレームからの座標ペアを比較および照合する方法を理解できません。実際のデータセットも約300万エントリであり、これを行うための最もメモリを消費しない方法は何でしょうか。

ロブレイモンド

ライブラリを使用して距離を計算するには、統合システムを使用する必要があります。グーグルから私はあなたがepsg:21781を使用していると思います

  1. 最初にを使用して座標系を標準化します pyproj
  2. 形のデカルト積を行う
  3. これらの間の距離を使用して計算します geopy
  4. これで、必要な結果の行を選択できます。例として、形でグループ化したときに最も近いものを取り上げました
import pyproj, geopy.distance
df1 = pd.DataFrame({'Ecode': [2669827.294, 2669634.483, 2669766.266, 2669960.683],
                    'Ncode': [1261034.528, 1262412.587, 1261209.646, 1262550.374],
                    'shape': ['square', 'square', 'triangle', 'circle']})
df2 = pd.DataFrame({'CoorE': [2669636, 2669765, 2669827, 2669961],
                    'CoorN': [1262413, 1261211, 1261032, 1262550],
                    'color': ['purple', 'blue', 'blue', 'yellow']})


# assuming this co-ord system https://epsg.io/21781 then mapping to https://epsg.io/4326
sc = pyproj.Proj("epsg:21781")
dc = pyproj.Proj("epsg:4326")

df1 = df1.assign(
    shape_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["Ecode"], r["Ncode"]), axis=1)
)
df2 = df2.assign(
    color_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["CoorE"], r["CoorN"]), axis=1)
)

(df1
     .assign(foo=1)
     .merge(df2.assign(foo=1), on="foo")
     .assign(distance=lambda x: x.apply(lambda r: 
                                        geopy.distance.geodesic(r["color_gps"], r["shape_gps"]).km, axis=1))
     .sort_values("distance")
 .groupby(["color","shape"]).agg({"distance":"first","CoorE":"first","CoorN":"first"})
)

最も近いマージ用に更新

距離を計算するための基準点を選択すると、必要なものが得られます。

import pyproj, geopy.distance
df1 = pd.DataFrame({'Ecode': [2669827.294, 2669634.483, 2669766.266, 2669960.683],
                    'Ncode': [1261034.528, 1262412.587, 1261209.646, 1262550.374],
                    'shape': ['square', 'square', 'triangle', 'circle']})
df2 = pd.DataFrame({'CoorE': [2669636, 2669765, 2669827, 2669961],
                    'CoorN': [1262413, 1261211, 1261032, 1262550],
                    'color': ['purple', 'blue', 'blue', 'yellow']})


# assuming this co-ord system https://epsg.io/21781 then mapping to https://epsg.io/4326
sc = pyproj.Proj("epsg:21781")
dc = pyproj.Proj("epsg:4326")
# pick a reference point for use in diatnace calcs
refpoint = pyproj.transform(sc, dc, df1.loc[0,["Ecode"]][0], df1.loc[0,["Ncode"]][0])

df1 = df1.assign(
    shape_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["Ecode"], r["Ncode"]), axis=1),
    distance=lambda x: x.apply(lambda r: geopy.distance.geodesic(refpoint, r["shape_gps"]).km, axis=1),
).sort_values("distance")
df2 = df2.assign(
    color_gps=lambda x: x.apply(lambda r: pyproj.transform(sc, dc, r["CoorE"], r["CoorN"]), axis=1),
    distance=lambda x: x.apply(lambda r: geopy.distance.geodesic(refpoint, r["color_gps"]).km, axis=1),
).sort_values("distance")

# no cleanup of columns but this works
pd.merge_asof(df1, df2, on="distance", direction="nearest")

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

完全一致なしで最も近い一致に基づいて2つのデータフレームをマージする

分類Dev

2つのデータフレーム間の比較一致に基づいて列を作成します

分類Dev

パンダは、一致する複数の列値に基づいて2つのデータフレームをマージします

分類Dev

最も近い日付に基づいて2つのデータフレームをマージする方法

分類Dev

Rの2つのデータフレームの2つの列の一致するペア名に基づいて、別のデータフレームの他の値に値を追加します

分類Dev

2つの列間の一致する値(正確)に基づいてデータフレームをフィルタリングします

分類Dev

2列の一致する行に基づいて2つのデータフレームをパンダとマージします

分類Dev

一致する行基準と共有列に基づいて2つのデータフレームをマージします

分類Dev

R:1つの完全一致と1つの最も近い(日付)一致に基づいてデータフレームをマージするにはどうすればよいですか?

分類Dev

2つのデータフレームからの2つの既存の列間の一致に基づいて頻度を追加します

分類Dev

Python / Pandas:列間の値の一致に基づいて、2つのデータフレームの列を結合しますが、マージは使用できません

分類Dev

2つのデータフレームをマージします。どちらも最も近い位置に基づく座標を使用します

分類Dev

データフレーム内の2つの異なる列間の一致に基づいて行を削除します

分類Dev

2つのデータフレームを比較し、一致する列の値に基づいてdfから行を削除します

分類Dev

2つのデータフレーム間の部分的な文字列に基づいて一致する行を取得します

分類Dev

一致しない2つのデータフレーム内の2つの要素に基づいて観測値を特定します

分類Dev

2つの列に基づいて2つのデータフレームをマージします

分類Dev

同じ値のペアを持つが、2つのデータフレームで異なる順序で表示される2つの列に基づいてパンダのデータフレームをマージします

分類Dev

Rの複数の列に基づいて2つのデータフレームをマージします

分類Dev

あるデータフレームから別のデータフレームへの2つのキーに基づいて最も近い一致を見つける方法は?

分類Dev

キー列に基づいて2つのデータフレームをマージする最良の方法

分類Dev

2番目のデータフレームの一致する列に基づいてパンダのデータフレームを更新します

分類Dev

最初の一致のみを維持しながら、列に基づいてデータフレームをマージします

分類Dev

2つのデータフレームの行が一致するかどうかに基づいて新しい列を作成します

分類Dev

1 つのデータフレームの 2 つの変数を「回答キー」データフレームの「キー」に一致させることに基づいて、「回答キー」データフレームから値を取得します。

分類Dev

日付範囲と値の一致に基づいてパンダのデータフレームをマージします

分類Dev

R:別のデータフレームの一致する行に基づいて列を更新します

分類Dev

一致する値に基づいて2つのpysparkデータフレームを結合します(特定の小数点まで)

分類Dev

Rの2つのデータフレーム間の文の最も近い一致

Related 関連記事

  1. 1

    完全一致なしで最も近い一致に基づいて2つのデータフレームをマージする

  2. 2

    2つのデータフレーム間の比較一致に基づいて列を作成します

  3. 3

    パンダは、一致する複数の列値に基づいて2つのデータフレームをマージします

  4. 4

    最も近い日付に基づいて2つのデータフレームをマージする方法

  5. 5

    Rの2つのデータフレームの2つの列の一致するペア名に基づいて、別のデータフレームの他の値に値を追加します

  6. 6

    2つの列間の一致する値(正確)に基づいてデータフレームをフィルタリングします

  7. 7

    2列の一致する行に基づいて2つのデータフレームをパンダとマージします

  8. 8

    一致する行基準と共有列に基づいて2つのデータフレームをマージします

  9. 9

    R:1つの完全一致と1つの最も近い(日付)一致に基づいてデータフレームをマージするにはどうすればよいですか?

  10. 10

    2つのデータフレームからの2つの既存の列間の一致に基づいて頻度を追加します

  11. 11

    Python / Pandas:列間の値の一致に基づいて、2つのデータフレームの列を結合しますが、マージは使用できません

  12. 12

    2つのデータフレームをマージします。どちらも最も近い位置に基づく座標を使用します

  13. 13

    データフレーム内の2つの異なる列間の一致に基づいて行を削除します

  14. 14

    2つのデータフレームを比較し、一致する列の値に基づいてdfから行を削除します

  15. 15

    2つのデータフレーム間の部分的な文字列に基づいて一致する行を取得します

  16. 16

    一致しない2つのデータフレーム内の2つの要素に基づいて観測値を特定します

  17. 17

    2つの列に基づいて2つのデータフレームをマージします

  18. 18

    同じ値のペアを持つが、2つのデータフレームで異なる順序で表示される2つの列に基づいてパンダのデータフレームをマージします

  19. 19

    Rの複数の列に基づいて2つのデータフレームをマージします

  20. 20

    あるデータフレームから別のデータフレームへの2つのキーに基づいて最も近い一致を見つける方法は?

  21. 21

    キー列に基づいて2つのデータフレームをマージする最良の方法

  22. 22

    2番目のデータフレームの一致する列に基づいてパンダのデータフレームを更新します

  23. 23

    最初の一致のみを維持しながら、列に基づいてデータフレームをマージします

  24. 24

    2つのデータフレームの行が一致するかどうかに基づいて新しい列を作成します

  25. 25

    1 つのデータフレームの 2 つの変数を「回答キー」データフレームの「キー」に一致させることに基づいて、「回答キー」データフレームから値を取得します。

  26. 26

    日付範囲と値の一致に基づいてパンダのデータフレームをマージします

  27. 27

    R:別のデータフレームの一致する行に基づいて列を更新します

  28. 28

    一致する値に基づいて2つのpysparkデータフレームを結合します(特定の小数点まで)

  29. 29

    Rの2つのデータフレーム間の文の最も近い一致

ホットタグ

アーカイブ