2017-07-18 5 views
2

enter image description herePython Pandas: bedingte Subtraktion

enter image description here

I bedingte Subtraktion auf dem Datenrahmen (dargestellt als das erste Bild) ausgeführt werden soll.

Im Grunde ist das, was ich tun möchte:

  1. die Werte von col1 und col2 von Lebensmitteln und Kleidung zwischen mir und subtrahieren Sie und neue Zeilen für die Unterschiede erstellen.

Da die erste Reihe hat ‚Lebensmittel‘ und ‚ich‘ und die dritte Reihe hat ‚Lebensmittel‘ und ‚Sie‘, die Werte von col1 und col2 der dritten Reihe von der ersten Zeile subtrahieren (300 - 600 = -300 und 200 - 500 = -300).

Da die zweite Zeile 'clothing' und 'me' hat und die vierte Zeile 'clothing' und 'you', subtrahiert man die Werte von col1 und col2 der vierten Zeile von der zweiten Zeile (500 - 200 = 300 und 600 - 700 = -100).

Wie implementiere ich dies mit Pandas Dataframe?

+0

'enden Beförderungen Datenrahmen Pandas, wie' df.T' zu tun und hängen Spalte es dann – Wen

+0

transportieren zurück Bitte beachten Sie up-Voting @ ScottBoston Antwort zusätzlich, es zu akzeptieren . Vielen Dank. – piRSquared

Antwort

2

Sie könnten es tun, auf diese Weise mit pd.concat, groupby und unter Ausnutzung der Pandas intrinsischer Ausrichtung von Daten basierend auf Indizes:

Eingang df:

df = pd.DataFrame({'type1':['food','clothing','food','clothing'],'type2':['me','me','you','you'],'col1':[300,500,600,200],'col2':[200,600,500,700]}) 


pd.concat([df.set_index(['type1','type2']) 
    .groupby('type1') 
    .apply(lambda x: x.iloc[0]-x.iloc[1]) 
    .assign(type2='us') 
    .set_index('type2', append=True), 
    df.set_index(['type1','type2'])]).reset_index() 

Für Pandas älter als 0.20.0

pd.concat([df.set_index(['type1','type2']) 
    .groupby(level=0) 
    .apply(lambda x: x.iloc[0]-x.iloc[1]) 
    .assign(type2='us') 
    .set_index('type2', append=True), 
    df.set_index(['type1','type2'])]).sort_index(level=[1,0]).reset_index() 

Ausgang:

 type1 type2 col1 col2 
0 clothing us 300 -100 
1  food us -300 -300 
2  food me 300 200 
3 clothing me 500 600 
4  food you 600 500 
5 clothing you 200 700 
+0

Hallo, ich habe versucht den Code, den Sie geschrieben haben, aber es gibt mir den KeyError: 'type1' mssage. –

+0

hrm ... Ich habe gerade diesen genauen Code ausgeschnitten und eingefügt und es lief gut. –

+0

das ist komisch ... hmm .. warum bekomme ich KeyError: 'type1' Fehler lol –

1

Ein Weg, um es mit eval

df \ 
    .set_index(['type2', 'type1']).unstack().T \ 
    .eval('us = me - you', inplace=False) \ 
    .T.stack().reset_index() 

    type2  type1 col1 col2 
0 me clothing 500 600 
1 me  food 300 200 
2 you clothing 200 700 
3 you  food 600 500 
4 us clothing 300 -100 
5 us  food -300 -300 
+1

Eval! +1 muss ich mehr verwenden. –

Verwandte Themen