Панды вращающиеся применяются пропустить определенные значения - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть фрейм данных, и я хочу вычислить столбец mean до тех пор, пока у меня не появятся значения для истинных действительных случаев.

ids              valid           value      mean (target output)
 1               False            0.1         0
 1               True             0.2        0.2
 1               True             0.4        0.3
 2               True             0.1        0.1
 2               False            0.5        0.1
 2               True             0.3        0.2
 3               True             0.1        0.1
 3               True             0.1        0.1
 3               False            0.5        0.1
 3               False            0.9        0.1

Как исключить ложные случаи из вычисления среднего значения, но все еще продолжает предыдущее среднее. Я пробовал это, но это не пропускает значения из ложных случаев. Я также пробовал использовать df [~ df.valid] перед групповым, но индекс не соответствует исходному df.

df['mean'] = df.groupby('ids').value.rolling(len(df), min_periods=1).apply(lambda x: np.mean(x)).values

1 Ответ

0 голосов
/ 10 ноября 2018

Вы можете сделать это, написав индивидуальное скользящее среднее с groupby.apply

df['mean'] = (
    df
    .groupby('ids')
    .apply(
        lambda df_: (df_['valid'] * df_['value']).cumsum() / (df_['valid']).cumsum()
    )
    .fillna(0)  # No valid rows seen -> 0
    .values     # get rid of the index
)
print(df)

   ids  valid  value  mean (target output)  mean
0    1  False    0.1                   0.0   0.0
1    1   True    0.2                   0.2   0.2
2    1   True    0.4                   0.3   0.3
3    2   True    0.1                   0.1   0.1
4    2  False    0.5                   0.1   0.1
5    2   True    0.3                   0.2   0.2
6    3   True    0.1                   0.1   0.1
7    3   True    0.1                   0.1   0.1
8    3  False    0.5                   0.1   0.1
9    3  False    0.9                   0.1   0.1

Поскольку скользящее среднее - это просто сумма, деленная на количество наблюдений, мы можем создавать скользящие версии обоих с cumsum, подавляя недопустимые строки, устанавливая как номер наблюдения, так и значение в ноль.

...