2017-05-16 3 views
0

Ich brauche eine Anleitung zu Python Pandas, da es ein unbekanntes Gebiet für einen Frontend Entwickler ist. Ich kenne das Dataframe-Konzept jetzt. Ich habe versucht, einen Weg zu finden, um einen neuen Datenrahmen zu erstellen, indem ich zwei andere Datenrahmen vergleiche. Was soll ich zu diesem Zweck in Pandas suchen?Suchen Sie nach Unterschieden in zwei Datenrahmen und erstellen Sie einen neuen Datenrahmen

Betrachten wir zum Beispiel DF1 als

Date   col1  col2  col3  id 
2017-04-14  2482  1  0  a2 
2017-04-15  2483  1  0  a3 

und DF2 als

Date   col1  col2  col3  id 
2017-04-15  2483  10  20  a3 
2017-04-14  2482  11  0  a2 

so was ich versuche, einen neuen Datenrahmen mit Details von Werten zu erreichen, zu schaffen, die anders sind wie

Date   df1_value df2_valuue diff_col_name val_diff  id 
2017-04-14  1   11   col2    -10   a2 
2017-04-15  1   11   col2    -9   a3 
2017-04-15  0   20   col3    20   a3 

so konnte ich die beiden dfs basierend auf ID, df1.merge(df2, on='id', how='left'), aber was tun d ist der nächste Schritt. Wie vergleiche ich die Unterschiede und erstelle das endgültige df?

+1

Mögliche Duplikat [Ausgabe Unterschied in zwei Pandas Datenrahmen nebeneinander - Hervorhebung der Differenz] (http://stackoverflow.com/ Fragen/17095101/Ausgabe-Differenz-in-zwei-Pandas-Datenrahmen-Seite-an-Seite-Hervorhebung-the-d) – philshem

Antwort

0

Setup-

df1 = pd.DataFrame({'Date': {0: '2017-04-14', 1: '2017-04-15'}, 
'col1': {0: 2482, 1: 2483}, 
'col2': {0: 1, 1: 1}, 
'col3': {0: 0, 1: 0}, 
'id': {0: 'a2', 1: 'a3'}}) 

df2 = pd.DataFrame({'Date': {0: '2017-04-15', 1: '2017-04-14'}, 
'col1': {0: 2483, 1: 2482}, 
'col2': {0: 10, 1: 11}, 
'col3': {0: 20, 1: 0}, 
'id': {0: 'a3', 1: 'a2'}}) 

Lösung

#melt the dfs to long df from wide df and merge them together. 
dfm = pd.merge(pd.melt(df1,id_vars=['Date','id']), 
       pd.melt(df2,id_vars=['Date','id']), 
       how='outer',on=['Date','id','variable']) 

#rename columns 
dfm.columns=['Date','id','diff_col_name','df1_value','df2_value'] 
#compare values 
dfm['val_diff'] = dfm.df1_value-dfm.df2_value 
#reorder columns 
dfm = dfm[['Date','df1_value','df2_value','diff_col_name','val_diff','id']] 
#filter unequal values 
dfm=dfm[dfm.val_diff!=0] 

Out[2001]: 
     Date df1_value df2_value diff_col_name val_diff id 
2 2017-04-14   1   11   col2  -10 a2 
3 2017-04-15   1   10   col2  -9 a3 
5 2017-04-15   0   20   col3  -20 a3 
Verwandte Themen