Python/Pandas : Remove rows with outlying values, 保留所有列

标签 python pandas scipy

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

我正在尝试这样:

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

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

TypeError: unsupported operand type(s) for +: 'float' and 'str'

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

最佳答案

考虑使用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

关于Python/Pandas : Remove rows with outlying values, 保留所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49392387/

相关文章:

python - 对齐 pandas 中的时间序列

python - 相等时返回不相等

Pandas - 获取某些行的小计

python - 如何在两个时间序列之间执行互相关以及我应该在 python 中执行哪些转换?

python - 编写了我的第一个 Python 程序,感谢用户输入递增

python - 如何使用 python 脚本发送邮件?

python - 如何微调 GPT-2 模型?

python - 使用 scipy.signal.argrelextrema 同时查找局部最小值和最大值

python-3.x - 如何消除(Python)中稀疏矩阵中的零?

python - 如何将 Django 应用程序合并到现有的扭曲服务器中?