使用 pandas 识别统计异常值:groupby 和个别列
Identifying statistical outliers with pandas: groupby and individual columns
我正在尝试了解如何识别我将发送到电子表格的统计异常值。我需要按索引对行进行分组,然后找到特定列的标准偏差,超出标准偏差的任何内容都将用于填充电子表格。
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 厘米身高超过男性身高标准偏差
首先,将您的身高从字符串转换为数值。
df['Height'] = df['Height'].astype(float)
然后您需要使用 transform
在 Sex
上分组以创建布尔指标标记,如果 any of Age
或 Height
是组内的统计异常值。
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
我正在尝试了解如何识别我将发送到电子表格的统计异常值。我需要按索引对行进行分组,然后找到特定列的标准偏差,超出标准偏差的任何内容都将用于填充电子表格。
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 厘米身高超过男性身高标准偏差
首先,将您的身高从字符串转换为数值。
df['Height'] = df['Height'].astype(float)
然后您需要使用 transform
在 Sex
上分组以创建布尔指标标记,如果 any of Age
或 Height
是组内的统计异常值。
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