2017-06-12 4 views
1

Gibt es einige integrierte Aggregation zu Pandas (oder NumPy?) Ich kann verwenden, um die mit *** markierte Linie unten zu optimieren?Verwenden Pandas für Aggregation integriert

>>> import numpy as np 
    >>> import pandas as pd 
    >>> 
    >>> df = pd.DataFrame({'A':[1,21,4,5,3,3,5,653,2], 'B':[1,2,3,4,5,6,7,8,9]}) 
    >>> steps = 3 
    >>> 
    >>> values = df.iloc[:,0] 
    >>> current = values[-steps:] 
    >>> old = values[:-steps] 
*** >>> mean = np.array([old[i::steps].mean() for i in range(steps)]) *** 
    >>> df.iloc[-steps:,0] = current - mean 
    >>> df1 = df.iloc[-steps:] 
    >>> df1 
      A B 
    6 2.0 7 
    7 641.0 8 
    8 -1.5 9 

Antwort

3

Wir mean in einer vektorisierten Weise berechnen könnte, die wegen der for-Schleife scheint der Engpass zu sein, wie so -

mean = old.values.reshape(-1,steps).mean(axis=0) 

Für die Fälle, wenn die Array-Größe nicht teilbar sein könnte von steps, könnten wir np.bincount verwenden -

ids = np.arange(a.size)%steps 
mean= np.bincount(ids, a)/np.bincount(ids) 
+0

Schöne Lösung, genau das, was ich suchte! –

+0

Wenn Shape nicht einfach durch "steps" teilbar ist, bekomme ich einen Fehler in der Form 'ValueError: kann Array der Größe 3025 nicht in Form umformen (1008)'. Kennen Sie einen einfachen Weg, um mein Array mit dem ersten Wert voranzustellen, bis ich es "Schritte" ausgerichtet habe? –

+1

@ JonasByström Eine Lösung dafür hinzugefügt. Es gibt andere Wege, aber die gepostete scheint die kürzeste zu sein, um diese Fälle zu behandeln. – Divakar

Verwandte Themen