2017-06-12 55 views
1

是否有一些內建聚合到Pandas(或NumPy?)我可以使用下面的***標記的優化線?利用內置的Pandas進行聚合

>>> 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 

回答

3

我們可以在一個量化的方式,這是考慮到for循環的似乎是瓶頸,像這樣計算mean -

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

對於情況下,當數組的大小可能不整除通過steps,我們可以使用np.bincount -

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

美麗的解決方案,正是我一直在尋找! –

+0

當形狀不容易被'steps'分割時,我得到一個錯誤'ValueError:can not reshape array of size 3025 into shape(1008)'。你知道一個簡單的方法來將我的數組與第一個值相加,直到我得到它的「steps」對齊嗎? –

+1

@JonasByström爲此添加了一個解決方案。還有其他的方法,但貼出來的似乎是處理這些案件的最短時間。 – Divakar