我有一个包含两列的Dataframe:
'Transmission' (object)
'City MPG (FT1)' (int64)
箱线图显示了一些异常值的传输值。手动5速(“传输”列中的一种传输类型)如果有异常值则有很多。
我想通过检查带分位数的值来删除带有异常值的行。
q_99 = data["City MPG (FT1)"].quantile(0.99)
q_1 = data["City MPG (FT1)"].quantile(0.01)
然后检查具有异常值的行,如下所示:
data[(data["City MPG (FT1)"] > q_99) | (data["City MPG (FT1)"] < q_1)]
因此,每个值高于0.99分位数,每个值低于0.01分位数。但是这种方式很容易得到异常值而没有来自“传输”列的相关传输。如何添加条件以及删除那些行的代码是什么?
编辑:我不能发布整个DF,因为它有32k行,而且太多了。以下是Dataframe的10个第一行:
data = pd.DataFrame({'Transmission':['Manual 5-Speed',
'Manual 5-Speed',
'Manual 5-Speed',
'Manual 5-Speed',
'Automatic 3-Speed',
'Automatic 3-Speed',
'Automatic 3-Speed',
'Automatic 3-Speed',
'Automatic 3-Speed',
'Automatic 3-Speed'],
'City MPG (FT1)':[17,17,18,
18,18,18,
13,13,15,16]})
我正在为原始数据框添加一列,以便您可以对其进行测试。
def fun(x):
q_99 = x.quantile(0.99)
q_1 = x.quantile(0.01)
return (x>q_99) | (x<q_1)
data["is_outlier"] = data.groupby("Transmission")["City MPG (FT1)"].transform(lambda x: fun(x))
现在您可以使用此列进行过滤。