En cherchant un meilleur moyen .., je vais le résumer ainsi pour le moment. ** (Si vous connaissez un meilleur moyen, faites-le moi savoir !!) **
① Basique Comme le montre la figure ci-dessous, il existe Excel qui stocke des points de coordonnées en trois dimensions et je souhaite lier des nombres avec les mêmes coordonnées. Dans l'exemple ci-dessous, les coordonnées de S / N-2 et les coordonnées de S / N-3 (surlignées en bleu clair) sont exactement les mêmes, elles sont donc considérées comme «les mêmes coordonnées!».
② Application En tant que spécification de la cible sur laquelle je travaille cette fois, il est difficile que les coordonnées correspondent exactement. Par conséquent, je voudrais juger qu'ils correspondent à un certain montant de marge. Par exemple, les coordonnées de S / N-8 et les coordonnées de S / N-9 (surlignées en jaune) correspondent ** presque **, alors veuillez juger qu'il s'agit également des «mêmes coordonnées».
Cette fois, je ne pouvais pas penser à une autre bonne idée pour cette "application". .. Si vous souhaitez extraire uniquement la correspondance exacte, j'ai pensé que vous devriez combiner la coordonnée X, la coordonnée Y et la coordonnée Z en tant que chaîne de caractères et juger si elles correspondent.
Tout d'abord, créez une fonction qui peut être jugée, y compris la marge. Dans les cas suivants, l'erreur ± 100 est ignorée et True est renvoyé si les trois coordonnées correspondent, y compris la marge.
def coordinates_check(ax,ay,az,bx,by,bz):
margin=100
flag = 0
result=False
if ax-margin < bx < ax+margin:
flag = flag +1
if ay-margin < by < ay+margin:
flag = flag +1
if az-margin < bz < az+margin:
flag = flag +1
if flag >2:
result = True
return result
Utilisez cette fonction pour lire les lignes du fichier Excel ci-dessus. Le numéro de début de la seconde instruction for est conçu de telle sorte que les lectures ne soient pas dupliquées.
df_test = pd.read_excel('sample.xlsx')
for i in range(len(df_test)):
ax= df_test.loc[i,"Coordonnée X"]
ay= df_test.loc[i,"Coordonnée Y"]
az= df_test.loc[i,"Coordonnée Z"]
k = i+1
for j in range(k,len(df_test)):
bx = df_test.loc[j,"Coordonnée X"]
by = df_test.loc[j,"Coordonnée Y"]
bz = df_test.loc[j,"Coordonnée Z"]
if coordinates_check(ax,ay,az,bx,by,bz):
print("Matched:",df_test.loc[i,"S/N"],"-->",df_test.loc[j,"S/N"])
En conséquence, c'est bien fait.
Les données que je souhaite utiliser cette fois-ci représentent plus de 10000 lignes et l'exécution du code ci-dessus a pris ** environ 3 heures ** ... C'est à cette époque que j'ai pensé qu'il devrait y avoir un meilleur moyen. Si vous connaissez un bon moyen, veuillez aider!