熊猫滚动应用跳过某些值

时间:2018-11-10 00:25:58

标签: python pandas conditional rolling-average

我有一个数据框,我想计算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

1 个答案:

答案 0 :(得分:1)

您可以通过使用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创建两者的滚动版本,同时通过将观察次数和值都设置为零来抑制无效行。