2017-02-14 3 views
3

Ich habe eine df mit zwei Spalten ‚a‘ und ‚b‘Pandas alle Werte von einem Wert subtrahieren, auf dem nächsten Wert bewegen und wiederholen

[a] [b] 
11 100 
2 100 
10 100 

Was ich brauche eine zusätzliche Spalte ‚c‘ ist, die folgende Berechnung darstellt:

((11-2) + (11-10))/100

((2-11) + (2-10))/100

((10- 11) + (10-2))/100

[a] [b] [c] 
11 100 0.1 
2 100 -0.17 
10 100 0.07 

Es sollte sehr dynamisch sein, so unterscheiden sich die maximale Zeilenzahl von [a]. Geschwindigkeit ist auch ein Anliegen, weshalb ich for-Schleifen vermeiden möchte.

Ich versuchte .apply() und .pivot(), um es in einem einfachen Format zu verwenden, nur sub rufen zu(), aber es hat nicht geklappt.

Antwort

2

Eine andere Lösung Rewrite Pandas:

Verwenden mul, sub, div und sum, für length von DataFrame am schnellsten len(df.index)

df['c'] = df.a.mul(len(df.index)).sub(df.a.sum()).div(df.b) 
print (df) 
    a b  c 
0 11 100 0.10 
1 2 100 -0.17 
2 10 100 0.07 

Es funktioniert, weil:

((11-2) + (11-10)) 

ist die gleiche wie:

(2 * 11) - (2 + 10) 

und gleiche wie:

(3 * 11) - (2 + 10 + 11) 
2

Ich werde ein numpy Beispiel geben. Für

>>> a = numpy.array([11, 2, 10]) 
>>> b = numpy.array([100, 100, 100]) 

können Sie

>>> c = (len(a) * a - sum(a))/b 

Ähnliche einen Pandas Datenrahmen tun.

+0

@ Michael2016 - kein Problem, es ist ok. – jezrael

Verwandte Themen