消除具有不同数据类型的数据框中的异常值 - 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_dtypes 从 df
中获取特定类型的所有列。
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)
]
我想消除具有不同数据类型(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_dtypes 从 df
中获取特定类型的所有列。
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)
]