2015-12-13 22 views
-1

我想在包含單列price的pandas數據框中創建一個新列comp。這個新列的值應該由對price的當前值和最後3個值起作用的函數生成。 df.apply()關閉一行,shift()似乎沒有工作。專家是否有任何建議讓它在矢量化操作中工作?訪問python數據框中的前一行應用方法

+0

'pd.rolling_apply' –

+0

你可能想用'shift'或'rolling_apply'方法嘗試。 –

+0

你可以添加例子嗎?也許幫助[這](http://stackoverflow.com/help/mcve)以及如何Stackoverflow [工程](http://stackoverflow.com/tour)。 – jezrael

回答

0

使用系列總和group.apply()函數。下面假設您有一個名爲ID的索引或列,其中增加了行值1,2,3,...,可用於計算回3個值。

# SERIES SUM FUNCTION 
def intsum(x): 
    if x < 3:   
     ser = df.price[(df.ID < x)] 
    else: 
     ser = df.price[(df.ID >= x - 3) & (df.ID < x)] 
    return ser.sum()  

# APPLY FUNCTION 
df['comp'] = df['ID'].apply(intsum) 
0

可以使用rolling_sum與參數min_periods=1,因爲你想得先算值:

print df 
    price 
0  1 
1  2 
2  3 
3  4 
4  5 
5  6 
6  7 


df['comp'] = pd.rolling_sum(df['price'], window=3, min_periods=1) 
print df 
    price comp 
0  1  1 
1  2  3 
2  3  6 
3  4  9 
4  5 12 
5  6 15 
6  7 18 

下一個解決方案是使用map

print df 
    price 
0  1 
1  2 
2  3 
3  4 
4  5 
5  6 
6  7 

def f(x): 
    return (df.price[(df.index - 1 >= x - 3) & (df.index - 1 < x)]).sum() 

df['comp'] = df.index.map(f) 

print df 
    price comp 
0  1  1 
1  2  3 
2  3  6 
3  4  9 
4  5 12 
5  6 15 
6  7 18 
相關問題