У меня есть df, скажем
import pandas as pd
col = 'one'
d = {col : pd.Series([1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1])}
df = pd.DataFrame(d)
df
df = 1,1,1,1,0,1,1,0,0,1,1
Теперь я хочу заменить все последовательные значения длины x (здесь x = 1) значением v (здесь v = 1).Так что мой новый df выглядит следующим образом
1,1,1,1, <1>, 1, 1, 0, 0, 1, 1
из
1,1,1,1, <0>, 1, 1, 0, 0, 1, 1
До сих пор мой подход состоит в построении последовательныхгруппам
def build_consecutive_groups(df: pd.DataFrame, col, newcol_appendix='_same'):
df[col + newcol_appendix] = (df[col] != df[col].shift()).cumsum()
return df.groupby(col + newcol_appendix, as_index=False)
для другого столбца 'one_same'
1,1,1,1,2,3,3,4,4,5,5
, что дает мне подгруппы.Теперь я могу использовать подгруппу apply, чтобы получить форму и проверить, где shape [0] равен 1, а значение равно 0, чтобы идентифицировать ячейку, которую я хочу заменить на 1. Затем создайте индексную серию, которая идентифицирует эти значения, и установитев последнем шаге к 1.
Но это выглядит очень сложно, и я думаю, что должен быть лучший способ, например, с использованием функции прокатки.