chi*_*n s 3 numpy scipy python-2.7 pandas
我有一个数据框如下:
ID Value
A 70
A 80
B 75
C 10
B 50
A 1000
C 60
B 2000
.. ..
Run Code Online (Sandbox Code Playgroud)
我想按ID对这些数据进行分组,从分组数据中删除异常值(我们从boxplot中看到的那些),然后计算平均值.
至今
grouped = df.groupby('ID')
statBefore = pd.DataFrame({'mean': grouped['Value'].mean(), 'median': grouped['Value'].median(), 'std' : grouped['Value'].std()})
Run Code Online (Sandbox Code Playgroud)
如何查找异常值,删除它们并获取统计信息.
我相信你所指的方法是删除值> 1.5*距离中位数的四分位数范围.首先,计算您的初始统计数据:
statBefore = pd.DataFrame({'q1': grouped['Value'].quantile(.25), \
'median': grouped['Value'].median(), 'q3' : grouped['Value'].quantile(.75)})
Run Code Online (Sandbox Code Playgroud)
然后确定原始DF中的值是否为异常值:
def is_outlier(row):
iq_range = statBefore.loc[row.ID]['q3'] - statBefore.loc[row.ID]['q1']
median = statBefore.loc[row.ID]['median']
if row.Value > (median + (1.5* iq_range)) or row.Value < (median - (1.5* iq_range)):
return True
else:
return False
#apply the function to the original df:
df.loc[:, 'outlier'] = df.apply(is_outlier, axis = 1)
#filter to only non-outliers:
df_no_outliers = df[~(df.outlier)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13481 次 |
| 最近记录: |