我有一个数据框,我想计算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
答案 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
创建两者的滚动版本,同时通过将观察次数和值都设置为零来抑制无效行。