下記のような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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/10/08 03:54