2017-03-06 95 views
0

使用我有以下矢量lambda函數在數據幀

3 
5 
6 
7 
4 
6 
7 
8 

我想執行該給定的矢量元素i lambda函數,計算I-3,I-2 i的平均值-1和第i個元素。但我不知道如何訪問lambda函數中的i-3,i-2,i-1元素。

+1

如果所有函數都有權訪問元素,則不能......但您應該提供更多細節。像,爲什麼它必須是'lambda'函數? –

+0

因爲我想探索更多關於這個功能的可能性。沒有使用任何for循環,你有沒有其他的選擇? – JPV

回答

2

,假設你知道我的指數位置。

import pandas as pd 

df = pd.DataFrame([3, 5, 6, 7, 4, 6, 7 ,8]) 
setx = lambda x: df.loc[x:x-3:-1].mean() 
# x is the index position of your target value. 
> setx(4) # Without mean() gives values [4, 7, 6, 5] 
>> 5.5 

但如果你想堅持PEP8標準,最好是定義一個函數,並避免在案件拉姆達其中(見python.org/dev/peps/pep-0008/#id50),分配功能通過在PEP8中建議使用的lambda表達式的標識符。 謝謝@Schmuddi的澄清

+0

澄清您的PEP8評論:確實您的示例不是PEP8推薦的(請參閱https://www.python.org/dev/peps/pep-0008/#id50),這是不正確的,這是最佳實踐只將lambda與「map/filter/reduce」一起使用 - 它只是通過在PEP8中建議禁止的「lambda」表達式將函數分配給標識符。 – Schmuddi

+0

感謝您的闡述。老實說,我不認爲我知道爲什麼它只是我使用的簡化版本,但是我可以在瘋狂中使用更明確的方法,這很好。 :) –

3

您可以使用rolling()方法訪問指定窗口內的Pandas系列的元素。然後,您可以使用lambda函數來計算該窗口中元素的平均值。爲了包括三個要素當前元素的左側,您使用的4的窗口大小:

In [39]: import pandas as pd 

In [40]: S = pd.Series([3, 5, 6, 7, 4, 6, 7, 8]) 

In [41]: S.rolling(4).apply(lambda x: pd.np.mean(x)) 
Out[41]: 
0  NaN 
1  NaN 
2  NaN 
3 5.25 
4 5.50 
5 5.75 
6 6.00 
7 6.25 
dtype: float64 

你會注意到,有前三個要素缺失值。這是因爲您只能從第四個元素開始形成大小爲4的窗口。但是,如果你想與小窗口來計算的第一要素,你可以使用參數min_periods指定的最小有效窗口大小:

In [42]: S.rolling(4, min_periods=1).apply(lambda x: pd.np.mean(x)) 
Out[42]: 
0 3.000000 
1 4.000000 
2 4.666667 
3 5.250000 
4 5.500000 
5 5.750000 
6 6.000000 
7 6.250000 
dtype: float64 

話雖如此,你不需要在lambda第一個地方 - 我只是因爲你明確要求lambdas才包含它。該方法rolling()創建具有一個內置的mean功能,您可以使用,像這樣一個Rolling對象:如果你想這樣做對大熊貓數據框最簡單的方法是使用的.loc

In [43]: S.rolling(4).mean() 
Out[43]: 
0  NaN 
1  NaN 
2  NaN 
3 5.25 
4 5.50 
5 5.75 
6 6.00 
7 6.25 
dtype: float64