4

我试图了解如何识别我将发送到电子表格的统计异常值。我将需要按索引对行进行分组,然后找到特定列的标准偏差,任何超过标准偏差的内容都将用于填充电子表格。

df = pandas.DataFrame({'Sex': ['M','M','M','F','F','F','F'], 'Age': [33,42,19,64,12,30,32], 'Height': ['163','167','184','164','162','158','160'],})

使用这样的数据集,我想按性别分组,然后找到超过年龄或身高标准差的条目。我见过的大多数示例都是针对整个数据集的标准开发,而不是按列细分。会有额外的列,比如状态,所以我不需要每列的标准开发,只需要集合中的特定列。

查找仅包含在任一列中被标识为统计异常值的行的数据的输出。例如:

0  M  64  164
1  M  19  184

假设 64 岁超过男子身高标准,身高 184 厘米超过男子身高标准

4

1 回答 1

6

首先,将您的身高从字符串转换为值。

df['Height'] = df['Height'].astype(float)

然后,如果组中的任何一个或是统计异常值,您需要对Sex使用进行分组transform以创建布尔指标标记。AgeHeight

stds = 1.0  # Number of standard deviation that defines 'outlier'.
z = df[['Sex', 'Age', 'Height']].groupby('Sex').transform(
    lambda group: (group - group.mean()).div(group.std()))
outliers = z.abs() > stds
>>> outliers
     Age Height
0  False  False
1  False  False
2   True   True
3   True   True
4   True  False
5  False   True
6  False  False

现在过滤包含任何异常值的行:

>>> df[outliers.any(axis=1)]
   Age  Height Sex
2   19     184   M
3   64     164   F
4   12     162   F
5   30     158   F

如果您只关心分布的上行空间(即值 > 平均值 + 2 个标准差),那么只需放弃.abs(),即lambda group: (group - group.mean()).div(group.std()).abs() > stds

于 2017-08-28T22:23:09.243 回答