【问题标题】:Remove outliers (+/- 3 std) and replace with np.nan in Python/pandas在 Python/pandas 中删除异常值(+/- 3 std)并替换为 np.nan
【发布时间】:2015-06-26 17:25:09
【问题描述】:

我已经看到了几个接近解决我的问题的解决方案

link1 link2

但到目前为止,他们并没有帮助我取得成功。

我相信以下解决方案是我所需要的,但仍然出现错误(而且我没有对此发表评论/问题的声誉点):link

(我收到以下错误,但我不明白在管理以下命令 df2=df.groupby('install_site').transform(replace) 时在哪里 .copy() 或添加“inplace=True”:

SettingWithCopyWarning: 试图在 DataFrame 中的切片副本上设置一个值。 尝试改用.loc[row_indexer,col_indexer] = value

请参阅文档中的注意事项:link

所以,我试图想出我自己的版本,但我一直卡住。来了。

我有一个按时间索引的数据框,其中包含站点列(许多不同站点的字符串值)和浮点值。

time_index            site       val

我想浏览按站点分组的“val”列,并将任何异常值(与平均值的 +/- 3 个标准偏差)替换为 NaN(对于每个组)。

当我使用以下函数时,我无法用我的真/假向量索引数据框:

def replace_outliers_with_nan(df, stdvs):
    dfnew=pd.DataFrame()
    for i, col in enumerate(df.sites.unique()):
        dftmp = pd.DataFrame(df[df.sites==col])
        idx = [np.abs(dftmp-dftmp.mean())<=(stdvs*dftmp.std())] #boolean vector of T/F's
        dftmp[idx==False]=np.nan  #this is where the problem lies, I believe
        dfnew[col] = dftmp
    return dfnew

另外,我担心上面的函数在超过 700 万行时会花费很长时间,这就是我希望使用 groupby 函数选项的原因。

【问题讨论】:

  • 您收到的错误只是一个警告。即使操作成功,它似乎有时也会出现。尽管有消息,您是否检查过使用该方法是否真的有效?

标签: python grouping outliers


【解决方案1】:

如果我的理解正确,则无需遍历列。此解决方案将所有偏离三个组标准差以上的值替换为 NaN。

def replace(group, stds):
    group[np.abs(group - group.mean()) > stds * group.std()] = np.nan
    return group

# df is your DataFrame
df.loc[:, df.columns != group_column] = df.groupby(group_column).transform(lambda g: replace(g, 3))

【讨论】:

  • 非常感谢@RickardSjogren。这很好用!我确实收到了 indexing-view-versus-copy 错误,但它最终会起作用。非常感谢!
  • 您能否建议一种将其独立应用于数据框的每一列的方法(即,替换每列的平均值 > 3std 的值)?我正在努力让它工作,我一直以一个空的数据框结束。
  • 我希望你能帮我解决上述问题,@RickardSjogren
  • 此解决方案应按列执行转换。填充有 NaN:s 的数据框可能是由于原始数据中的缺失值导致 meanstd 调用混乱。虽然没有看到您的数据,但我无法进行故障排除。
  • group_column 是如何定义的?
猜你喜欢
  • 2021-06-22
  • 2014-01-20
  • 2020-08-05
  • 1970-01-01
  • 2016-05-30
  • 2018-10-28
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多