Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫按剔除异常值分组_Python_Python 3.x_Pandas_Pandas Groupby - Fatal编程技术网

Python 熊猫按剔除异常值分组

Python 熊猫按剔除异常值分组,python,python-3.x,pandas,pandas-groupby,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'], 'co

我想按组删除基于百分位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)]
df[df.groupby(“Group”)['count'].transform(λx:(x(x.quantile(0.01)))).eq(1)]

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

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]})
print(pd.DataFrame(df.groupby('Group').quantile(.01)['count']))
输出:

       count
Group       
A        1.1
B        3.3
  Group  count
0     A    1.1
2     A    1.1
3     B    3.3
4     B    3.4
5     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)
以下是我的解决方案:

def是异常值:
下限=s.平均值()-(s.标准值()*3)
上限=s.平均值()+(s.标准值()*3)
返回~s.between(下限、上限)
df=df[~df.groupby('Group')['count'].apply(是异常值)]

你可以编写你自己的is_离群值函数

df.groupby('Group')['count'].transform(lambda x:xis)有什么简单的方法吗?通过查看太多的步骤。我们可以合并成小代码吗?这比标记的答案更简洁易读。如果你想要百分位数而不是3 SD,请使用
s.quantile(.01)
用于下限,
s.quantile(.99)
用于上限