/ / Python: Utwórz zmienną przyrostową, która zmienia się w zależności od warunku - python, pętle, pandy, grupowanie

Python: Utwórz inkrementującą zmienną, która zmienia się w zależności od warunku - python, pętle, pandy, grupy

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 № 1

Zwykle 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