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