1

J'ai deux trames de données.Elémentaire Soustraction (ou addition) de colonnes de deux bases de données basées sur les mêmes valeurs/correspondances dans d'autres colonnes

df1 = pd.DataFrame({'Ver' : [2,2,2], 
        'SN' : [1,1,1], 
        'Split' : [AA,AA,AA] 
        'Quad' : [3,3,4] 
        'Channel' : [1,2,0] 
        'Mean' : [1,2,3] 
        'Other' : [10,10,10] 
        'Mean2' : [1,2,3] 
        'Other2' : [10,10,10] 
}) 

df1 = pd.DataFrame({'Ver' : [2,2,2], 
        'SN' : [1,1,1], 
        'Split' : [AA,AA,AA] 
        'Quad' : [3,3,4] 
        'Channel' : [3,2,0] 
        'Mean' : [4,5,6] 
        'Other' : [10,10,10] 
        'Mean2' : [4,5,6] 
        'Other2' : [10,10,10] 
}) 

je voudrais soustraire la colonne moyenne dans DF1 de la moyenne colonne DF2 et faire que pour les éléments dont les valeurs correspondent dans les colonnes SN ', « Quad », « Channel ». Si ces valeurs ne correspondent pas, je voudrais "jeter" les données. Je voudrais faire la même chose pour la colonne mean2. Je voudrais assigner la trame de données résultante à une nouvelle base de données. Y a-t-il un moyen facile/direct de le faire chez les pandas?

je finirais avec:

resultant_df= pd.DataFrame({'Ver' : [2,2], 
        'SN' : [1,1], 
        'Split' : [AA,AA] 
        'Quad' : [3,4] 
        'Channel' : [2,0] 
        'Mean' : [-3,-3] 
        'Other' : [,10,10] 
        'Mean2' : [-3,-3] 
        'Other2' : [10,10] 
})    

Répondre

0
In [70]: df1 = pd.DataFrame({ 'SN':[1,1,1], 'Quad':[3,3,4], 
    ...:      'Channel':[1,2,0], 'Mean':[1,2,3] }) 

In [71]: df2 = pd.DataFrame({ 'SN':[1,1,1], 'Quad':[3,3,4], 
    ...:      'Channel':[3,2,0], 'Mean':[4,5,6] }) 

In [72]: results = df1.merge(df2, on=['Channel','Quad','SN']) 

In [73]: results['Mean'] = results.Mean_x - results.Mean_y 

In [74]: results[ list(df1.columns) ] 
Out[74]: 
    Channel Mean Quad SN 
0  2 -3  3 1 
1  0 -3  4 1 
+0

@JohnE Remercier! un autre problème est que le nombre de lignes entre mes données n'est pas le même, c'est-à-dire que df1 peut avoir plus de lignes que df2. est-il de toute façon pour contourner cela? Je n'avais aucune idée que nous pourrions utiliser des évaluations booléennes comme celle-ci. Votre réponse a été informative – user3416986

+0

merci pour le conseil. J'ai essayé set_index() et j'obtiens le message d'erreur suivant (le même que précédemment): Les longueurs de série doivent correspondre pour comparer. Cela se produit lorsque je définis les conditions de comparaison, similaire à votre bool = ((df1.Channel == df2.Channel) & (df1.Quad == df2.Quad)) ligne – user3416986

+0

Ah, oui, je viens de réécrire le répondez en utilisant la fusion(). C'est une meilleure façon de faire ce que vous essayez de faire. – JohnE