Я обошел некоторые проблемы с pandas
копиями и срезами, сначала преобразовав в массив numpy
, выполнив там операции, а затем заново вставив столбец.Я не уверен, но, насколько я могу судить, тип данных остается прежним, когда он возвращается в pandas.DataFrame
.
def df_replace_with_previous(df,col,maskfunc,inplace=False):
arr = np.array(df[col])
mask = maskfunc(arr)
arr[ mask ] = arr[ list(mask)[1:]+[False] ]
if inplace:
df[col] = arr
return
else:
df2 = df.copy()
df2[col] = arr
return df2
. Это создает маску, сдвигает ее на единицу, так чточто значения True
указывают на предыдущую запись и обновляют массив.Конечно, это нужно будет выполнять рекурсивно, если есть несколько смежных выбросов (N раз, если есть N последовательных выбросов), что не идеально.
Использование в случае, указанном в OP:
df_replace_with_previous(df,'A',lambda x:x>10,False)