2017-10-09 5 views
1

Ich habe zwei unsymmetrische Datenrahmen und möchte eine dritte erstellen, indem ich Werte subtrahiere, um das Delta zwischen ihnen zu erhalten. Hier ist ein Beispiel für die drei Datenrahmen. Ich möchte CURRENT nehmen, entsprechend EXPECTED subtrahieren, um DELTA zu bekommen. Dies funktioniert wie erwartet und ich produziere die korrekten Ergebnisse in DELTA, wenn Werte in CURRENT und EXPECTED existieren. Wenn sie jedoch nicht existieren, bekomme ich NaN in DELTA. Als ich es möchte, wie unten sein:Subtrahieren von zwei unsymmetrischen Datenrahmen in Pandas

 CURRENT 
     Region1 Region2 
type1 5   3 
type2 2   11 
type3 7   1 

     EXPECTED 
     Region1 Region2 
type1 15   1 
type2 6   4 

     DELTA 
     Region1 Region2 
type1 -10  2 
type2 -4   7 
type3 7   1 

Mit meinem aktuellen Code ist die type3 Reihe in DELTA NaN, NaN.

def get_delta(self, CURRENT, EXPECTED): 
    delta = CURRENT 
    delta['Region1'] = current[['Region1']] - \ 
           expected[['Region1']] 
    delta['Region2'] = current[['Region2']] - \ 
           expected[['Region2']] 
    return delta 

Ich habe versucht zu überprüfen, ob delta.isnull() oder delta.empty, aber das funktioniert nicht. Im Wesentlichen möchte ich jeden nicht vorhandenen Wert in EXPECTED als 0 behandeln und dann einfach die Subtraktion CURRENT - RESERVED vornehmen, um DELTA zu erhalten. Ich glaube, ich könnte dies tun, indem jede NaN als 0 Behandlung oder durch Reihen Ausfüllen fehlenden in ERWARTET mit dem richtigen Zeilen/Indizes als 0.

Ich habe versucht:

new_df = pd.concat([CURRENT, EXPECTED], axis=1).fillna(0) 

und dann von dort abgezogen, aber wenn ich die concat versuche, erhalte ich einen Fehler "ValueError: Formunübereinstimmung: value array of shape (0,13) konnte nicht zum Indizierungsergebnis von shape (1,13) übertragen werden", also nicht sicher, was dort vor sich geht.

Antwort

0

Sie benötigen DataFrame.sub mit dem Parameter fill_value=0:

DELTA = CURRENT.sub(EXPECTED, fill_value=0) 
print (DELTA) 
     Region1 Region2 
type1 -10.0  2.0 
type2  -4.0  7.0 
type3  7.0  1.0 
+0

Dank! Genau das benötigte ich und erlaubte mir, eine ganze Deltafunktion aus meinem Code zu entfernen. – Aaron

+0

Gern geschehen – jezrael

0

Verwenden reindex

In [217]: CURRENT - EXPECTED.reindex(CURRENT.index, fill_value=0) 
Out[217]: 
     Region1 Region2 
type1  -10  2 
type2  -4  7 
type3  7  1 

Einzelheiten

In [218]: CURRENT 
Out[218]: 
     Region1 Region2 
type1  5  3 
type2  2  11 
type3  7  1 

In [219]: EXPECTED 
Out[219]: 
     Region1 Region2 
type1  15  1 
type2  6  4 
Verwandte Themen