1

我有一个数据框,我想计算该mean列,直到我拥有 True 有效案例的值点。

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

如何从均值计算中排除 False 案例,但仍保留之前的均值。我试过了,但它没有跳过 False 案例中的值。我也在 groupby 之前尝试过 df[~df.valid] 但索引与原始 df 不匹配。

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

1 回答 1

2

您可以通过编写自定义滚动平均值来做到这一点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通过将观察数和值都设置为零来创建两者的滚动版本,同时抑制无效行。

于 2018-11-10T00:52:16.640 回答