使用 group by apply 和 np.select 函数时得到奇怪的输出

问题描述 投票:0回答:1

我正在处理时间序列数据,其中我尝试使用 IQR 方法执行异常值检测。

样本数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({'datecol' : pd.date_range('2024-1-1', '2024-12-31'),
                   'val' : np.random.random.randin(low = 100, high = 5000, size = 8366})

我的功能:

def is_outlier(x):
    iqr = x.quantile(.75) - x.quantile(.25)
    outlier = (x <= x.quantile(.25) - 1.5*iqr) | (x >= x.quantile(.75) + 1.5*iqr)
    return np.select([outlier], [1], 0)

df.groupby(df['datecol'].dt.weekday)['val'].apply(is_outlier)

输出如下:

0    [1,1,0,0,....
1    [1,0,0,0,....
2    [1,1,0,0,....
3    [1,0,1,0,....
4    [1,1,0,0,....
5    [1,1,0,0,....
6    [1,0,0,1,....

我期待一个单一的系列作为输出,我可以将其添加回原始

dataframe
作为标志列。

有人可以帮我吗

python pandas numpy
1个回答
0
投票

您应该使用

groupby.transform
,而不是
apply

df['flag'] = df.groupby(df['datecol'].dt.weekday)['val'].transform(is_outlier)

输出:

       datecol   val  flag
0   2024-01-01  3193     0
1   2024-01-02  1044     0
2   2024-01-03  2963     0
3   2024-01-04  4448     0
4   2024-01-05  1286     0
..         ...   ...   ...
361 2024-12-27  1531     0
362 2024-12-28  4565     0
363 2024-12-29  3396     0
364 2024-12-30  1870     0
365 2024-12-31  3818     0
© www.soinside.com 2019 - 2024. All rights reserved.