大熊猫组删除异常值

时间:2018-05-17 17:24:42

标签: python python-3.x pandas pandas-groupby

我想逐组删除基于百分位数99值的异常值。

 import pandas as pd
 df = pd.DataFrame({'Group': ['A','A','A','B','B','B','B'], 'count': [1.1,11.2,1.1,3.3,3.40,3.3,100.0]})

在输出中我想从A组中删除11.2,从组b中删除100。所以在最终数据集中只会有5个观察结果。

wantdf = pd.DataFrame({'Group': ['A','A','B','B','B'], 'count': [1.1,1.1,3.3,3.40,3.3]})

我试过这个,但我没有得到理想的结果

df[df.groupby("Group")['count'].transform(lambda x : (x<x.quantile(0.99))&(x>(x.quantile(0.01)))).eq(1)]

2 个答案:

答案 0 :(得分:3)

我不认为您想使用分位数,因为您将排除较低的值:

       count
Group       
A        1.1
B        3.3

输出:

left = pd.DataFrame(df.groupby('Group').median() - pd.DataFrame(df.groupby('Group').std()))
right = pd.DataFrame(df.groupby('Group').median() + pd.DataFrame(df.groupby('Group').std()))

left.columns = ['left']
right.columns = ['right']

df = df.merge(left, left_on='Group', right_index=True)
df = df.merge(right, left_on='Group', right_index=True)

df = df[(df['count'] > df['left']) & (df['count'] < df['right'])]
df = df.drop(['left', 'right'], axis=1)
print(df)

那些不是异常值,对吧?所以你不想排除它们。

您可以尝试使用中位数的标准偏差设置左右限制吗?这有点冗长,但它给你正确的答案:

  Group  count
0     A    1.1
2     A    1.1
3     B    3.3
4     B    3.4
5     B    3.3

输出:

class Hidden
{
   private:
      friend class Exposed;
      Hidden() {}
      int hidden_x;
};

class Exposed
{
  public:
      Exposed() {}
      void DoStuff() { printf( "%d" , hidden.hidden_x ); }
  private:
      Hidden hidden_;
};

答案 1 :(得分:2)

这是我的解决方法:

def is_outlier(s):
    lower_limit = s.mean() - (s.std() * 3)
    upper_limit = s.mean() + (s.std() * 3)
    return ~s.between(lower_limit, upper_limit)

df = df[~df.groupby('Group')['count'].apply(is_outlier)]

您可以编写自己的is_outlier函数