我的DataFrame包含多个时间序列,每当时间序列中的某个点超出平均值一个标准偏差时,我都希望进行标记。
df = pd.DataFrame(np.random.rand(3, 10), index=['ts_A', 'ts_B','ts_C'])
std = df.std(axis=1)
mean = df.mean(axis=1)
然后我希望能够做到:
df.mask(df > (std + mean), 'True', inplace=True)
应该返回原始DataFrame,其中将比该行/时间序列的平均值高出一个标准偏差以上的任何值替换为True。
但是,相反,它为每个元素返回false。如果我使用df.where,则整个DataFrame都将填充True。
我可以通过遍历索引并依次屏蔽每一行来做到这一点,但是我敢肯定必须有更好的方法。
答案 0 :(得分:2)
将gt
与axis=0
一起使用
df.mask(df.gt(std + mean,axis=0), 'True', inplace=True)
df
0 1 2 3 4 5 6
ts_A 0.003797 0.060297 0.265496 0.442663 True 0.498443 0.436738
ts_B 0.127535 0.644332 True 0.079317 0.0411021 True 0.830672
ts_C 0.693698 0.429689 0.371802 0.312407 0.0555868 True True
7 8 9
ts_A 0.403529 0.392445 0.238355
ts_B 0.732539 0.030451 0.895976
ts_C 0.907143 0.912002 0.098821
如果需要返回T和F
TorF=df.gt(std + mean,axis=0)
TorF
Out[31]:
0 1 2 3 4 5 6 7 8 9
ts_A False False False False True False False False False False
ts_B False False True False False True False False False False
ts_C False False False False False True True False False False