0
votes

Comment effectuer une opération de pandas entre plusieurs rangées tout en enregistrant l'origine dans MultiDex

comme un suivi de Ma question précédente Sur le sujet

suppose le Dataframe suivant: p> xxx pré>

Je voudrais faire un calcul entre toutes les lignes à toutes les autres lignes.
Par exemple, si le calcul était Lambda R1, R2: ABS (R1-R2) CODE>, puis un moyen de former une sortie serait P>

id    id2    out        
1     2       10         
1     3       200         
1     4       3000       
2     1       10        
2     3       190        
2     4       2990       
3     1       200         
3     2       190        
3     4       2800        
4     1       3000      
4     2       2990       
4     3       2800      


2 commentaires

Vous avez commenté dans votre question originale que votre cas d'utilisation réelle Calcule toutes les distances entre une liste de points 3D [donnée sous forme de 6 colonnes en entrée] . Que comptez-vous faire avec ces distances? Si vous avez besoin de trouver le voisin le plus proche de chaque point, ou des voisins les plus proches les plus proches, etc., vous souhaiterez peut-être examiner la structure de données de l'arborescence KD, qui a des implémentations dans Scikit-apprendre ( scikit-learn.org/stable/modules/generated/.../a>) et scipy ( docs.cipy.org/doc/scipy/reference/generated/... ). Chemin plus rapide et efficace de la mémoire.


@Peterleimbigler Je devrai faire une analyse qui n'est pas encore claire. J'aurai probablement besoin d'interroger "toutes les distances pour lesquelles leurs points d'orinage répondent à un prédicat". Je n'aurai pas besoin de Knn. Probablement.


3 Réponses :


1
votes

Nous pouvons aborder ce problème ce qui suit:

  1. Définissez toutes les combinaisons avec itheroTools.Production code>. p> li>

  2. fusionner nos valeurs à nos combinaisons p> li>

  3. Calculez notre out code> colonne p> li> OL>

        id  id2     A   A_2   out
    1    2    1    10     0    10
    2    3    1   200     0   200
    3    4    1  3000     0  3000
    4    1    2     0    10    10
    6    3    2   200    10   190
    7    4    2  3000    10  2990
    8    1    3     0   200   200
    9    2    3    10   200   190
    11   4    3  3000   200  2800
    12   1    4     0  3000  3000
    13   2    4    10  3000  2990
    14   3    4   200  3000  2800
    


1 commentaires

Ah Oke, attendant la réponse de l'OP puis @ anky_91



1
votes

Définir le Dataframe d'origine:

df_joined['result'] = abs(df_joined['A'] - df_joined['A_r'])

            A   A_r  result
id_r id                    
1    2     10     0      10
     3    200     0     200
     4   3000     0    3000
2    1      0    10      10
     3    200    10     190
     4   3000    10    2990
3    1      0   200     200
     2     10   200     190
     4   3000   200    2800
4    1      0  3000    3000
     2     10  3000    2990
     3    200  3000    2800


0 commentaires

2
votes

Est-ce ce dont vous avez besoin? XXX PRE>


ou P>

s=pd.DataFrame(abs(df.A.values[:,None]-df.A.values),index=df.id,columns=df.id).astype(float)
s.values[[np.arange(len(s))]*2]=np.nan
s.stack()
id  id
1   2       10.0
    3      200.0
    4     3000.0
2   1       10.0
    3      190.0
    4     2990.0
3   1      200.0
    2      190.0
    4     2800.0
4   1     3000.0
    2     2990.0
    3     2800.0
dtype: float64


3 commentaires

Je suppose que ce serait le code le plus court, mais je voudrais 0 et 1 pour faire partie d'un index multiple.


@Gulzar Ajouter une nouvelle méthode :-)


@Wenyoben aime toujours vos réponses!