2017-03-06 6 views
0

Ich habe folgenden VektorLambda-Funktion zu verwenden, in Datenrahmen

3 
5 
6 
7 
4 
6 
7 
8 

Und ich mag eine Lambda-Funktion implementieren, die ein Vektorelement i gegeben, berechnet den Mittelwert von i-3, i-2 i -1 und i-tes Element. Aber ich weiß nicht, wie ich auf die i-3, i-2, i-1 Elemente in der Lambda-Funktion zugreifen kann.

+1

Wenn alle Funktion Zugriff auf das Element hat, können Sie nicht ... aber Sie sollten mehr Details angeben. Wie, warum muss es eine "Lambda" -Funktion sein? –

+0

Weil ich mehr über die Möglichkeiten dieses Features erfahren möchte. Haben Sie eine Alternative, ohne eine For-Schleife zu verwenden? – JPV

Antwort

2

, wenn Sie es auf einem Pandas Datenrahmen der einfachste Weg, .loc verwenden tun wollen, unter der Annahme, Sie kennen die Indexposition von i.

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 

Obwohl, wenn Sie mit PEP8 Standards halten wollen, ist es am besten, eine Funktion zu definieren und Lambda in Fällen zu vermeiden, in denen (siehe python.org/dev/peps/pep-0008/#id50), Zuweisen von Funktionen zu eine Kennung mittels eines Lambda-Ausdrucks, von dem in PEP8 abgeraten wird. Danke @Schmuddi für die Klarstellung.

+0

Um Ihren Kommentar zu PEP8 zu verdeutlichen: Es stimmt zwar, dass Ihr Beispiel von PEP8 nicht empfohlen wird (siehe https://www.python.org/dev/peps/pep-0008/#id50), aber es ist nicht wahr, dass es die beste Vorgehensweise ist um nur lambda mit "map/filter/reduce" zu verwenden - es gibt nur Funktionen zu einem Bezeichner durch einen '' lambda' 'Ausdruck, von dem in PEP8 abgeraten wird. – Schmuddi

+0

Danke für die Ausarbeitung. Ehrlich gesagt, ich glaube nicht, dass ich wusste, warum es nur die vereinfachte Version war, die ich benutzte, aber es ist gut, eine explizitere Methode zu haben, die ich in meinem Wahnsinn verwenden kann, lol. :) –

3

Sie können die Methode rolling() verwenden, um auf die Elemente einer Pandas-Serie innerhalb eines angegebenen Fensters zuzugreifen. Dann können Sie eine Lambda-Funktion verwenden, um den Mittelwert für die Elemente in diesem Fenster zu berechnen. Um die drei Elemente auf der linken Seite des aktuellen Elements aufzunehmen, verwenden Sie eine Fenstergröße von 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 

Sie werden bemerken, dass es fehlende Werte für die ersten drei Elemente. Dies ist so, weil Sie erst ab dem vierten Element ein Fenster der Größe 4 beginnen können. Wenn Sie jedoch mit kleineren Fenstern für die ersten Elemente berechnen möchten, können Sie das Argument min_periods die kleinste gültige Fenstergröße angeben:

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 

Having said that, müssen Sie das Lambda nicht brauchen der erste Platz - ich habe es nur aufgenommen, weil Sie explizit nach Lambdas gefragt haben. Das Verfahren rolling() schafft ein Rolling Objekt, das eine eingebaute in mean Funktion hat, die Sie verwenden können, etwa so:

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