针对在单个列中发现的离群值删除数据集的整行
Deleting entire rows of a dataset for outliers found in a single column
我目前正在尝试使用中值绝对偏差法从我的数据集中删除离群值。
为此,我遵循了@tanemaki 在 Detect and exclude outliers in Pandas data frame 中给出的说明,该说明可以删除包含至少一个离群值的整行。
在我链接的 post 中,有人问了同样的问题,但没有得到回答。
问题是我只想在单个列中搜索异常值。
因此,例如,我的数据框如下所示:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
4 40.31 9.3
5 26.21 15.6
6 26.59 17.9
比如数据中有两个'异常:
- 第[4]行的温度值
- 第 [5] 行中的日期值
所以,我想要的是离群值函数只'notice'温度列中的异常,并删除其对应的行。
我使用的离群代码是:
df=pd.read_excel(r'/home/.../myfile.xlsx')
from scipy import stats
df[pd.isnull(df)]=0
dfn=df[(np.abs(stats.zscore(df))<4).all(axis=1)] #@taneski
print(dfn)
我生成的数据框目前看起来像:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
6 26.59 17.9
如果我没有传达我的信息,期望的输出将是:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
5 26.21 15.6
6 26.59 17.9
任何指点都会有很大帮助。谢谢!
您始终可以将 stats.zscore
操作限制在 Temperature
列而不是整个 df
列。像这样也许:
In [573]: dfn = df[(np.abs(stats.zscore(df['Temperature']))<4)]
In [574]: dfn
Out[574]:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
5 26.21 15.6
6 26.59 17.9
目前,您正在计算整个数据帧的 zscores,然后使用计算出的分数过滤数据帧;您要做的只是将相同的想法应用到一列中。
而不是
dfn=df[(np.abs(stats.zscore(df))<4).all(axis=1)]
你想要
df[np.abs(stats.zscore(df["Temperature"])) < 4]
作为旁注,我发现我无法通过将 zscores 与 4 进行比较来获得您的示例结果;我不得不把它调低到 2。
我目前正在尝试使用中值绝对偏差法从我的数据集中删除离群值。
为此,我遵循了@tanemaki 在 Detect and exclude outliers in Pandas data frame 中给出的说明,该说明可以删除包含至少一个离群值的整行。
在我链接的 post 中,有人问了同样的问题,但没有得到回答。
问题是我只想在单个列中搜索异常值。
因此,例如,我的数据框如下所示:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
4 40.31 9.3
5 26.21 15.6
6 26.59 17.9
比如数据中有两个'异常:
- 第[4]行的温度值
- 第 [5] 行中的日期值
所以,我想要的是离群值函数只'notice'温度列中的异常,并删除其对应的行。
我使用的离群代码是:
df=pd.read_excel(r'/home/.../myfile.xlsx')
from scipy import stats
df[pd.isnull(df)]=0
dfn=df[(np.abs(stats.zscore(df))<4).all(axis=1)] #@taneski
print(dfn)
我生成的数据框目前看起来像:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
6 26.59 17.9
如果我没有传达我的信息,期望的输出将是:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
5 26.21 15.6
6 26.59 17.9
任何指点都会有很大帮助。谢谢!
您始终可以将 stats.zscore
操作限制在 Temperature
列而不是整个 df
列。像这样也许:
In [573]: dfn = df[(np.abs(stats.zscore(df['Temperature']))<4)]
In [574]: dfn
Out[574]:
Temperature Date
1 24.72 2.3
2 25.76 4.6
3 25.42 7.0
5 26.21 15.6
6 26.59 17.9
目前,您正在计算整个数据帧的 zscores,然后使用计算出的分数过滤数据帧;您要做的只是将相同的想法应用到一列中。
而不是
dfn=df[(np.abs(stats.zscore(df))<4).all(axis=1)]
你想要
df[np.abs(stats.zscore(df["Temperature"])) < 4]
作为旁注,我发现我无法通过将 zscores 与 4 进行比较来获得您的示例结果;我不得不把它调低到 2。