Chcę utworzyć zmienną o nazwie „inc”zwiększa się sekwencyjnie za każdym razem, gdy spełniony jest warunek (powiedzmy Delta> = 5), zachowuje to samo w przeciwnym przypadku i resetuje do 1 za każdym razem, gdy napotka nową grupę (w tym przykładzie ID). Oto przykładowa ramka danych:
from pandas import *
d={"rx": [1,1,1,1,1,2,2,2,2,2],
"vals": [1,2,3,8,10,1,10,20,21,22]}
df=DataFrame(d)
def diff_func(df):
return df.diff()
df["delta"] = df.groupby(["rx"])["vals"].apply(diff_func)
Który produkuje to:
rx vals delta
1 1 NaN
1 2 1
1 3 1
1 8 5
1 10 2
2 1 NaN
2 10 9
2 20 10
2 21 1
2 22 1
Więc teraz chcę utworzyć nową kolumnę o nazwie „Zdarzenie”, której później użyję do grupowania obserwacji w obrębie każdej wartości rx oddzielonej deltą <5:
rx vals delta Event
1 1 NaN 1
1 2 1 1
1 3 1 1
1 8 5 2
1 10 2 2
2 1 NaN 1
2 10 9 2
2 20 10 3
2 21 1 3
2 22 1 3
Zauważ, że „zdarzenie” wraca do 1 na pierwszymwystąpienie rx. Jestem przyzwyczajony do robienia tego w vbasic lub SAS, gdzie po prostu zachowujesz wartość, a następnie zwiększasz ją o 1 za każdym razem, gdy wyzwalacz progowy jest spełniony. Czy w Pythonie jest podobnie proste rozwiązanie?
Odpowiedzi:
1 dla odpowiedzi № 1Zwykle stosuje się porównanie, a następnie sumę skumulowaną. Na przykład coś takiego:
>>> df["Event"] = (df["delta"] >= 5).groupby(df["rx"]).cumsum() + 1
>>> df
rx vals delta Event
0 1 1 NaN 1
1 1 2 1 1
2 1 3 1 1
3 1 8 5 2
4 1 10 2 2
5 2 1 NaN 1
6 2 10 9 2
7 2 20 10 3
8 2 21 1 3
9 2 22 1 3
który działa, ponieważ (ignorując groupby dla uproszczenia i koncentrując się tylko na rx == 1
:) False == 0
i True == 1
:
>>> df["delta"]
0 NaN
1 1
2 1
3 5
4 2
Name: delta, dtype: float64
>>> df["delta"] >= 5
0 False
1 False
2 False
3 True
4 False
Name: delta, dtype: bool
>>> (df["delta"] >= 5).cumsum()
0 0
1 0
2 0
3 1
4 1
Name: delta, dtype: int64