【问题标题】:Pandas - Get outliers with condition from another columnPandas - 从另一列获取异常值
【发布时间】:2017-12-26 23:14:03
【问题描述】:

我有一个包含两列的数据框:

'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]})

【问题讨论】:

  • 您介意与我们分享您原始 df 的一部分吗?可能是df.to_dict()。谢谢
  • 是的,我会的。但我只会向你们展示其中的一部分,因为它有 32k 行。
  • 请检查您的 data 第二列有 9 个元素,而第一列有 10 个元素。然后你的数据在分位数之外没有值
  • 请更正data[(data["City MPG (FT1)"] &gt; q_100) | (data["City MPG (FT1)"] &lt; q_0)]中的拼写错误
  • 无论如何,除了错别字,对我来说它是有效的。我的意思是我可以看到两列

标签: python pandas


【解决方案1】:

我正在向您的原始数据框添加一列,以便您对其进行测试。

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))    

现在您可以使用此列进行过滤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-06
    • 2019-10-17
    • 1970-01-01
    • 2020-12-19
    • 2020-03-26
    • 1970-01-01
    • 2021-05-10
    • 2021-08-03
    相关资源
    最近更新 更多