/ / Pandas DataFrame Powtarzalna wartość na podstawie warunku - python, pandy

Panda DataFrame Powtarzalna wartość na podstawie warunku - python, pandy

Próbuję powtórzyć wartości wierszy w DataFrame na podstawie warunków w kolumnie.Jeśli wartość w kolumnie Zmień = 1, to chciałbym powtórzyć wartości w kolumnach A, B i C, aż do następnej zmiany = 1 .

index = pandas.date_range("20000131", periods=5)
columns = ["A", "B", "C", "Change"]

data = {"A": pandas.Series([False, True, False, True, False], index=index)
, "B": pandas.Series([True, True, False, False, False], index=index)
, "C": pandas.Series([True, False, True, True, True], index=index)
, "Change" : pandas.Series([1,0,0,1,0], index=index)}

Wyniki:

                A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01   True   True  False       0
2000-02-02  False  False   True       0
2000-02-03   True  False   True       1
2000-02-04  False  False   True       0

Pożądane wyniki:

                A      B      C  Change
2000-01-31  False   True   True       1
2000-02-01  False   True   True       0
2000-02-02  False   True   True       0
2000-02-03   True  False   True       1
2000-02-04   True  False   True       0

To jest najbliższy, z którego mogłem skorzystaćshift (), ale utrzymuje się tylko w jednym wierszu. Potrzebuję go, aby przetrwał dla N liczby wierszy. Rozkłada się w trzecim rzędzie (lub wierszu 2 z bazą 0) w poniższym przykładzie.

print pandas.DataFrame(numpy.where(pandas.DataFrame(df["Change"]==1)
, df, df.shift()))

Wyniki:

       0      1      2  3
0  False   True   True  1
1  False   True   True  1
2  False   True  False  0
3   True  False   True  1
4   True  False   True  1

Dziękuję Ci.

Odpowiedzi:

5 dla odpowiedzi № 1

Możesz wypełnić Change == 0 wierszy za pomocą NaN i ffill:

In [11]: df.loc[df.Change != 1, ["A", "B", "C"]] = numpy.nan

In [12]: df
Out[12]:
A   B   C  Change
2000-01-31   0   1   1       1
2000-02-01 NaN NaN NaN       0
2000-02-02 NaN NaN NaN       0
2000-02-03   1   0   1       1
2000-02-04 NaN NaN NaN       0

In [13]: df.ffill()
Out[13]:
A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       0
2000-02-02  0  1  1       0
2000-02-03  1  0  1       1
2000-02-04  1  0  1       0

Jeśli potrzebujesz tych kolumn, musisz użyć astype(bool) na każdej kolumnie.

Na marginesie możesz prawie to z resample (z wyjątkiem ostatnich brakujących wierszy i kolumny Changed):

In [14]: df[df.Change == 1].resample("D", fill_method="ffill")
Out[14]:
A  B  C  Change
2000-01-31  0  1  1       1
2000-02-01  0  1  1       1
2000-02-02  0  1  1       1
2000-02-03  1  0  1       1