消除具有不同数据类型的数据框中的异常值 - Pandas

Eliminate outliers in a dataframe with different dtypes - Pandas

我想消除具有不同数据类型(int64 和对象)的列的数据框中的异常值。我需要删除至少在一列中有异常值的所有行。所以,我尝试使用以下代码:

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

对于每一列,此代码使用列的均值和标准差计算每个值的 Z 得分。 'all(axis=1)' 保证对于每一行,所有列都满足约束条件(每个 z-score 的绝对值低于 3)。

但是,由于某些列的 dtype 是 'object',我收到以下错误:TypeError: unsupported operand type(s) for /: 'str' and 'int'

我认为发生这种情况是因为无法计算仅包含字符串 ('object' dtype) 的列中的 z 分数。所以,我需要一个只考虑数值列的代码来检测和消除异常值。

您知道如何消除具有不同数据类型(int64 和对象)的列的数据框中的异常值吗?

此数据框是关于 属性 巴西的租金。您可以使用以下代码创建示例:

data = {
    'city': ['São Paulo', 'Rio', 'Recife'],
    'area(m2)': [90, 120, 60],
    'Rooms': [3, 2, 4],
    'Bathrooms': [2, 3, 3],
    'animal': ['accept', 'do not accept', 'accept'],
    'rent($)': [2000, 3000, 800]
}

df = pd.DataFrame(
    data,
    columns=['city', 'area(m2)', 'Rooms', 'Bathrooms', 'animal', 'rent($)']
)

print(df)

样本是这样的:

       city  area(m2)  Rooms  Bathrooms         animal  rent($)
0  São Paulo        90      3          2         accept     2000
1        Rio       120      2          3  do not accept     3000
2     Recife        60      4          3         accept      800

原始数据集位于:https://www.kaggle.com/rubenssjr/brasilian-houses-to-rent

您可以遍历列并获取每列的数据类型,并且仅在它具有您想要的类型时才计算离群值。您可以保留一个 运行 索引列表来删除。像这样。

drop_idx = []
for cols in df:
    if df[cols].dtype not in (float, int):
        continue
    # grab indexes of all outliers, notice that its '>= 3' now 
    drop_idx.extend(df[np.abs(stats.zscore(df[cols])) >= 3].index))
df = df.drop(set(drop_idx))

尝试使用 select_dtypesdf 中获取特定类型的所有列。

To select all numeric types, use np.number or 'number'

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