Мы можем попробовать data.table
. Преобразуйте «data.frame» в «data.table» (setDT(df1)
), сгруппированные по «группе», мы получим cummax
«var» и назначим (:=
) его новой переменной («curMax ')
library(data.table)
setDT(df1)[, curMax := cummax(var), by = group]
Как прокомментировал @Michael Chirico, если данные не order
отредактированы «временем», мы можем сделать это в «i»
setDT(df1)[order(time), curMax:=cummax(var), by = group]
< hr> Или с помощью dplyr
library(dplyr)
df1 %>%
group_by(group) %>%
mutate(curMax = cummax(var))
Как насчет пересылки каждой группы?
df = df.groupby(['id'], as_index=False).apply(lambda group: group.ffill())
Вероятно, эффективно выполнить fillna
непосредственно на объекте groupby:
df = df.groupby(['id']).fillna(method='ffill')
Метод, на который ссылается здесь в документации.
github / jreback: это обман # 7895. .ffill не реализован в cython при операции groupby (хотя это, безусловно, может быть), и вместо этого называет пространство python для каждой группы. вот простой способ сделать это. url: https://github.com/pandas-dev/pandas/issues/11296
df = df.sort_values('id')
df.ffill() * (1 - df.isnull().astype(int)).groupby('id').cumsum().applymap(lambda x: None if x == 0 else 1)