gpt4 book ai didi

python - 通过 groupby 删除异常值 pandas?

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:41 24 4
gpt4 key购买 nike

我有一个删除大纲并返回新 DataFrame 的简单函数:

def remove_outliner(df):
df.index = df.time
df['median']= df['price'].rolling(15).median()
df['std'] = df['price'].rolling(15).std()
df["std+"] = df['median']+3*df['std']
df["std-"] = df['median']-3*df['std']
#filter setup
df2 = df[(df.price <= df['median']+3*df['std']) &
(df.price >= df['median']-3*df['std'])]
return df2

有没有办法使用 groupby 来应用这样的功能?所以像这样(伪代码):

df.groupby(["product"]).filter(remove_outliner).concat_groups()

我天真的方法是迭代这些组。将它们保存在列表中,然后应用 pd.concat。但我希望有更优雅的方式。非常感谢任何提示!

PS:示例输入

                               product price 
2014-08-25 01:00:00 A 1.2
2014-08-25 02:00:00 B 7.2
2014-08-25 03:00:00 A 1.2
2014-08-25 04:00:00 B 7.2
2014-08-25 04:00:00 A 1.2
2014-08-25 05:00:00 A 99.2
2014-08-25 06:00:00 A 1.2
2014-08-25 06:00:00 B 7.2
2014-08-25 21:00:00 A 1.2
2014-08-25 22:00:00 B 88.2

预期结果

                               product price 
2014-08-25 01:00:00 A 1.2
2014-08-25 02:00:00 B 7.2
2014-08-25 03:00:00 A 1.2
2014-08-25 04:00:00 B 7.2
2014-08-25 04:00:00 A 1.2
2014-08-25 06:00:00 A 1.2
2014-08-25 06:00:00 B 7.2
2014-08-25 21:00:00 A 1.2

如果第一行消失就好了。 remove_outliner 函数添加了一些列,但它们可以被删除。由于不同的产品可能有不同的价格范围,我不能只在价格上应用过滤器,需要与组一起工作。

最佳答案

所以我试着稍微修改一下你的函数(你可能不希望你的数据框中有 medianstd):

def remove_outliner(df):
roll_median= df['price'].rolling(15).median()
roll_std = df['price'].rolling(15).std()

#filter setup
df2 = df[(df.price.le(roll_median + 3*roll_std) &
(df.price.ge(roll_median - 3*roll_std)]

return df2

# set_index here, not inside the function:
df.set_index('time').groupby('product', group_keys=False).apply(remove_outliner)

关于python - 通过 groupby 删除异常值 pandas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56541073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com