【问题标题】:Python/Pandas: Remove rows with outlying values, keeping all columnsPython/Pandas:删除具有异常值的行,保留所有列
【发布时间】:2018-03-21 04:24:24
【问题描述】:

我有一个包含许多数值和分类值的数据集,我只想测试数值列上的异常值并根据这些列删除行。

我正在尝试这样:

df = df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]

它将删除所有列中的所有异常值,但是当然因为我有分类列,我遇到了以下错误:

TypeError: +: 'float' 和 'str' 的操作数类型不受支持

我知道上面的解决方案有效,因为如果我将 df 限制为仅包含数字列,则一切正常,但我不想在从数字评估异常值的过程中丢失数据框中的其余信息列。

【问题讨论】:

  • @ALollz 我试过这样做,但会导致错误,我将代码更改为:df = df[(np.abs(stats.zscore([df.select_dtypes(include=[np.number])])) &lt; 3).all(axis=1)] 所以它只查看数字列,但会引发以下错误:@987654324 @。我有 13 个数字列。你能给我一个例子,说明如何按照你说的方式去做吗?

标签: python pandas scipy


【解决方案1】:

考虑通过排除任何对象(即字符串)列来使用select_dtypes

df = df[(np.abs(stats.zscore(df.select_dtypes(exclude='object'))) < 3).all(axis=1)]

演示使用具有较小 zscore 检查的随机数据(为可重复性播种):

import numpy as np
import pandas as pd

from scipy import stats

LETTERS = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')

np.random.seed(1001)

# DATAFRAME OF 50 COLUMNS
df = pd.DataFrame({'NUM1': np.random.randn(50)*100,
                   'NUM2': np.random.uniform(0,1,50),                   
                   'NUM3': np.random.randint(100, size=50),                                             
                   'CAT1': ["".join(np.random.choice(LETTERS,1)) for _ in range(50)],
                   'CAT2': ["".join(np.random.choice(['pandas', 'r', 'julia', 'sas', 'stata', 'spss'],1)) for _ in range(50)],              
                   'CAT3': ["".join(np.random.choice(['postgres', 'mysql', 'sqlite', 'oracle', 'sql server', 'db2'],1)) for _ in range(50)]
                  })

# DATAFRAME OF 11 ROWS
df = df[(np.abs(stats.zscore(df.select_dtypes(exclude='object'))) < 1).all(axis=1)]

print(df)   # julia and sql server wins the random draw!
#    CAT1    CAT2        CAT3       NUM1      NUM2  NUM3
# 11    I   julia      sqlite -91.661975  0.443330    73
# 13    I   stata      sqlite  -8.614349  0.668918    69
# 18    H   julia         db2  39.477287  0.624378    56
# 27    B  pandas  sql server -26.400278  0.834240    77
# 29    O    spss    postgres -96.410727  0.748933    45
# 32    Q    spss      sqlite -49.963199  0.731111    70
# 34    R   stata         db2  30.983686  0.772178    62
# 36    B   julia  sql server  72.945459  0.763171    68
# 46    I   julia    postgres   8.454257  0.387944    39
# 48    Y     sas      oracle  85.189272  0.842956    43
# 49    F   stata  sql server -75.488531  0.370730    40

【讨论】:

  • 这似乎工作得很好,我没想到与exclude相反。我有一个问题,对于选择 z-score 值有什么建议吗?我知道它定义了数据必须是标准偏差的数量,在我的情况下,我使用的值是3,但是您是否碰巧知道有关所选 z 值是否一定是一个好值的任何迹象减少异常值?
  • 太棒了!乐意效劳。我不相信异常值标准有经验法则。您作为分析师应该选择有正当理由。有些以非常低/高的百分位数去除异常值。这真的只是取决于数据的分布、分析需求、文献实践等。请咨询同事、导师、同学,甚至是Stats SE
  • 太好了,非常感谢您提供的信息和解决方案!我一定会更多地研究 z-score 的用途以及如何为我的数据集选择一个合适的。
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 2016-10-13
  • 2020-03-24
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
相关资源
最近更新 更多