使用我有以下矢量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元素。
使用我有以下矢量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元素。
,假設你知道我的指數位置。
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的澄清。
澄清您的PEP8評論:確實您的示例不是PEP8推薦的(請參閱https://www.python.org/dev/peps/pep-0008/#id50),這是不正確的,這是最佳實踐只將lambda與「map/filter/reduce」一起使用 - 它只是通過在PEP8中建議禁止的「lambda」表達式將函數分配給標識符。 – Schmuddi
感謝您的闡述。老實說,我不認爲我知道爲什麼它只是我使用的簡化版本,但是我可以在瘋狂中使用更明確的方法,這很好。 :) –
您可以使用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
如果所有函數都有權訪問元素,則不能......但您應該提供更多細節。像,爲什麼它必須是'lambda'函數? –
因爲我想探索更多關於這個功能的可能性。沒有使用任何for循環,你有沒有其他的選擇? – JPV