🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

2338閲覧

python XY座標の近しい値を結合させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2019/10/07 10:05

編集2019/10/08 03:50

下記のようなPANDASのデータフレームに入っているデータがあります。

データ系列
・PARAM列に、SPC〇 もしくは、FAI〇 とう文字列のデータがある。
・SPC〇、FAI〇は、常に1対1対応の関係にある。

実施したい処理

・x,yの座標が近いもの同士を、FAI〇/SPC〇というペアにさせる。
・SPC〇の行はペア成立後に消去される。
・最後に全てのFAIの列が、FAI〇/SPC〇という組合せになる。

処理の考え方

 PANDASに入っているので、まずFAIとSPCに分割しようとしています。
str.containsを使って、文字の一部で検索させることは、簡単に出来ました。

そのあとの流れとしては、

  • FAI,SPCという、2つのデータフレームに入れて、SPC側でループを回して、
  • FAIと総当りで比較して、最小になるFAIのインデックスを探す
  • 見つかったFAIにSPCを合体させて、SPCの列を消去し、SPCがなくなるまで実施する

というフローをまでは考えました。

困っていること

しかしながら、PANDASの処理に不慣れなため、まったくコードが書けません。
大変申し訳ありませんが、このような処理は、どう書けばいいものでしょうか?

 

python

1file=ファイル 2 3import pandas as pd 4df = pd.read_csv(file) 5df[df['FAI'].str.contains('SPC')]
Unnamed: 0 x y PARAM URL 15 15 3142.5 1039.0 SPCA C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 18 18 3238.5 2224.0 SPCR C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 19 19 1371.5 959.0 SPCJ C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 20 20 3523.5 1653.0 SPCB C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 21 21 3315.5 1377.0 SPCc C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 22 22 3812.5 3493.0 SPCG C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 23 23 4962.5 3825.0 SPCH C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 24 24 2106.5 1796.0 SPCK C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 25 25 3705.5 894.0 SPCOo C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 26 26 1770.5 3615.0 SPCF C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 27 27 2328.5 1769.0 SPCQa C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 28 28 4994.5 3108.0 SPCI C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 29 29 2387.5 3087.0 SPCE C:\Users\mm05162\Documents\GitHub\opencv\OPENC... ​
ipdb> df x y FAI URL 0 3142.5 1125.0 FAI17 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 1 3452.5 1653.0 FAI18 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 2 3386.5 1377.0 FAI19 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 3 3167.5 2224.0 FAI42 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 4 4850.5 3617.0 FAI27 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 5 5516.5 3269.0 FAI26 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 6 4452.5 3113.0 FAI28 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 7 2064.5 2153.0 FAI43 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 8 3741.5 3493.0 FAI23 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 9 1701.5 3615.0 FAI22 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 10 1371.5 1048.0 FAI29 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 11 2035.5 1796.0 FAIL30 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 12 4923.5 3108.0 FAI25 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 13 3705.5 964.0 FAI20 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 14 2257.5 1769.0 FAI41 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 15 3142.5 1039.0 SPCA C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 16 2318.5 3087.0 FAI2l C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 17 4891.5 3825.0 FAI24 C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 18 3238.5 2224.0 SPCR C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 19 1371.5 959.0 SPCJ C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 20 3523.5 1653.0 SPCB C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 21 3315.5 1377.0 SPCc C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 22 3812.5 3493.0 SPCG C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 23 4962.5 3825.0 SPCH C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 24 2106.5 1796.0 SPCK C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 25 3705.5 894.0 SPCOo C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 26 1770.5 3615.0 SPCF C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 27 2328.5 1769.0 SPCQa C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 28 4994.5 3108.0 SPCI C:\Users\mm05162\Documents\GitHub\opencv\OPENC... 29 2387.5 3087.0 SPCE C:\Users\mm05162\Documents\GitHub\opencv\OPENC...

自己解決(案)

ひとまず動くものを作成する必要があり、下記のように作成しました。
FAI〇を番号で並べようとしていますが、文字列ソートなので、

FAI1 → FAI10 というふうになります。

これをFAI1,FAI2という、文字列+数字でソーティングするところが
まだ出来ていませんが、まず動いたので、これで本件は解決になりました。

python

1import pandas as pd 2import math 3 4def distance(a,b,c,d): 5 return math.sqrt((a-c)**2+(b-d)**2) 6 7def main(file): 8 df = pd.read_csv(file) 9 df=df.rename(columns={df.columns[0]: 'no'}) 10 11 fai_df=df[df['PARAM'].str.contains('FAI')] 12 spc_df=df[df['PARAM'].str.contains('SPC')] 13 14 minds =[] 15 for j,spc in spc_df.iterrows(): 16 mind = 9999999999 17 pair =[] 18 for i,fai in fai_df.iterrows(): 19 dis = distance(fai['x'],fai['y'],spc['x'],spc['y']) 20 if dis < mind: 21 mind = dis 22 pair=[i,fai['x'],fai['y'],fai['PARAM']+"/"+spc['PARAM'],fai['URL'],spc['URL']] 23 minds.append(pair) 24 25 new_df = pd.DataFrame(minds,columns=['no','x', 'y','PARAM','URL','URL2']) 26 final_df= pd.concat([new_df,fai_df],sort=False) 27 final_df= final_df.drop_duplicates(subset='no') 28 return(final_df) 29 30if __name__ == '__main__': 31 df= main(file) 32
no x y PARAM URL 0 0 3142.5 1125 FAI17/SPCA C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result1.png 1 1 3452.5 1653 FAI18/SPCB C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result2.png 2 12 2318.5 3087 FAI2l/SPCE C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result17.png 3 4 1701.5 3615 FAI22/SPCF C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result10.png 4 5 3741.5 3493 FAI23/SPCG C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result9.png 5 6 4891.5 3825 FAI24/SPCH C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result18.png 6 7 4923.5 3108 FAI25/SPCI C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result13.png 7 11 1371.5 1048 FAI29/SPCJ C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result11.png 8 16 2035.5 1796 FAIL30/SPCK C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result12.png 9 3 3705.5 964 FAI20/SPCOo C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result14.png 10 13 2257.5 1769 FAI41/SPCQa C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result15.png 11 14 3167.5 2224 FAI42/SPCR C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result4.png 12 2 3386.5 1377 FAI19/SPCc C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result3.png 8 8 5516.5 3269 FAI26 C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result6.png 9 9 4850.5 3617 FAI27 C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result5.png 10 10 4452.5 3113 FAI28 C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result7.png 15 15 2064.5 2153 FAI43 C:\Users\mm05162\Documents\GitHub\opencv\OPENCV_TESTING\result8.png

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

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

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

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

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

guest

回答1

0

ベストアンサー

私もpandasを使いはじめたばかりなのですが、こんな感じではどうでしょうか。
(質問にある例では FAIデータ個数:SPCデータ個数 = 17:13 なので、13個のみマッチングさせています)

python

1import numpy as np 2import pandas as pd 3 4# df = pd.read_table('test.data', sep='\t', index_col=0) 5spc = df[df['FAI'].str.startswith('SPC')] 6fai = df[df['FAI'].str.startswith('FAI')] 7 8ans = pd.DataFrame() 9f = fai.loc[:, ['x', 'y']] 10for row in spc.itertuples(): # 全てのSPCxxデータについてループ 11 dist = np.linalg.norm(np.subtract(f, (row.x, row.y)), axis=1) # FAIxxまでの距離を計算 12 s_df = spc.loc[row.Index, ['FAI', 'x', 'y']] # 現在のSPCxxデータを抜き出し 13 f_df = fai.iloc[dist.argmin()] # 距離が最も近いFAIxxデータを抜き出し 14 s_df['FAI2'], s_df['x2'], s_df['y2'] = f_df['FAI'], f_df['x'], f_df['y'] # データを結合 15 ans = ans.append(s_df) 16 17print(ans) 18""" 19 FAI FAI2 x x2 y y2 2015 SPCA FAI17 3142.5 3142.5 1039.0 1125.0 2118 SPCR FAI42 3238.5 3167.5 2224.0 2224.0 2219 SPCJ FAI29 1371.5 1371.5 959.0 1048.0 2320 SPCB FAI18 3523.5 3452.5 1653.0 1653.0 2421 SPCc FAI19 3315.5 3386.5 1377.0 1377.0 2522 SPCG FAI23 3812.5 3741.5 3493.0 3493.0 2623 SPCH FAI24 4962.5 4891.5 3825.0 3825.0 2724 SPCK FAIL30 2106.5 2035.5 1796.0 1796.0 2825 SPCOo FAI20 3705.5 3705.5 894.0 964.0 2926 SPCF FAI22 1770.5 1701.5 3615.0 3615.0 3027 SPCQa FAI41 2328.5 2257.5 1769.0 1769.0 3128 SPCI FAI25 4994.5 4923.5 3108.0 3108.0 3229 SPCE FAI2l 2387.5 2318.5 3087.0 3087.0 33"""

投稿2019/10/08 03:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/10/08 03:54

ありがとうございます。 本来は2重のループで距離最小を求めましたが、 教えていただいた内容を使うと、1重ループでも出来るのですね。 細かい部分、いろいろソースを見させていただき、勉強させていただきます。 どうも有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問