2 votes

Comment obtenir les valeurs minimales dans le dataframe en dessous d'un certain seuil ?

J'ai deux cadres de données dans pandas contenant des informations sur la localisation des voitures et des arbres.

df1

                 x       y   
         car
          3     216     13    
          4     218     12    
          5     217     12  

df2

                 x       y    
          tree 
          5     253     180    
          6     241     24    
          8     217     14  

Comment puis-je calculer la distance euclidienne entre chaque voiture et chaque arbre, puis filtrer les distances inférieures à 5, par exemple ? Je voudrais créer un autre cadre de données avec le numéro de la voiture et de l'arbre, et la distance entre les deux (voir ci-dessous).

df3

         car   tree    dist     
          5     8      2.2    

Jusqu'à présent, je peux utiliser

 distance = scipy.spatial.distance.cdist(df1, df2, metric='euclidean')

pour obtenir les distances euclidiennes pour tout, mais j'ai du mal à sélectionner les valeurs dont j'ai besoin (c'est-à-dire les distances < 5). Aide appréciée, merci !

2voto

jpp Points 83462

Voici un moyen :

import pandas as pd
from toolz import concat
import scipy

df1 = pd.DataFrame([[3, 216, 13],
                    [4, 218, 12],
                    [5, 217, 12]],
                   columns=['car', 'x',  'y'])
df1 = df1.set_index('car')

df2 = pd.DataFrame([[5, 253, 180],
                    [6, 241, 24],
                    [8, 217, 14]],
                   columns=['tree', 'x',  'y'])
df2 = df2.set_index('tree')

indices = list(map(list, zip(*[(x, y) for x in df1.index for y in df2.index])))
distance = scipy.spatial.distance.cdist(df1, df2, metric='euclidean')

df3 = pd.DataFrame({'car': indices[0], 'tree': indices[1], 'distance': list(concat(distance))})

df4 = df3[df3['distance'] < 5]

2voto

Tai Points 4569
distance = spatial.distance.cdist(df1, df2, metric='euclidean')
idx = np.where(distance < 5)
pd.DataFrame({"car":df1.iloc[idx[0]].index.values, 
              "tree":df2.iloc[idx[1]].index.values,
              "dist": distance[idx]})

    car dist        tree
0   3   1.414214    8
1   4   2.236068    8
2   5   2.000000    8
  • L'entrée (i, j) de cdist est la distance entre le ième élément du premier groupe d'éléments et le jième élément du second groupe d'éléments.
  • Nous utilisons np.where pour identifier les paires (i, j) dans distance qui satisfont à la condition distance < 5 .
  • Nous avons construit un nouveau cadre de données avec l'indice obtenu lors de la dernière étape. idx[0] donne la partie en df1 que nous devons récupérer et idx[1] donne la partie en df2 que nous devons obtenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X