零、导入库

1
2
3
4
5
6
import pandas as pd
import numpy as np

# 读取数据
data = pd.read_excel('111.xlsx')
data.head()

一、三倍标准判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 计算均值
price_mean = data['租价/月'].mean()
# 计算标准差
price_std = data['租价/月'].std()

# 定义超出均值的三倍标准差范围就是异常值
price_min = price_mean - 3*price_std
price_max = price_mean + 3*price_std

data['租价/月'].map(lambda x:(x > price_max) or (x < price_min)) # 匿名函数判断这一列里面是否是异常值,返回布尔值
data[data['租价/月'].map(lambda x:(x > price_max) or (x < price_min))] # 提取出异常值

# 处理异常值
ls1 = []
for i in range(len(data)):
x = data['租价/月'].iloc[i]
if x < price_min:
ls1.append(price_min)
elif x > price_max:
ls1.append(price_max)
else:
ls1.append(x)

data['三倍标准差(覆盖法)'] = ls1 # 在最后添加新列

二、四分位数判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 计算25分位
price_25 = data['租价/月'].quantile(0.25)
# 计算75分位
price_75 = data['租价/月'].quantile(0.75)

# 定义超出上下分位1.5IQR(1.5倍上下分位之差)范围就是异常值
price_min = price_25 - 1.5*(price_75 - price_25)
price_max = price_25 + 1.5*(price_75 - price_25)

data[data['租价/月'].map(lambda x:(x > price_max) or (x < price_min))] # 提取出异常值

# 处理异常值
ls1 = []
for i in range(len(data)):
x = data['租价/月'].iloc[i]
if x < price_min:
ls1.append(np.nan) # 也可以设置成缺失值
elif x > price_max:
ls1.append(np.nan)
else:
ls1.append(x)

data['分位法'] = ls1 # 在最后添加新列
data[data['分位法'].isnull()]

data2 = data[data['分位法'].notnull()] # 清除nan
data2 = data['分位法'].fillna(data['分位法'.mean()]) # 或者用均值填补

三、字符串处理(补充)

1
2
3
4
5
6
7
8
9
10
11
s = data['名称'].iloc[0] # 提取字符串
'西武学园 1室1厅1卫 40m² 3100元'

s.split(' ') # 用空格分开
s.split(' ')[0] # 即可提取第一个信息
data['名称'].map(lambda x:x.split(' ')[0]) # 提取所有的第一个信息
data['名称'].apply(lambda x:x.split(' ')[0]) # 类似,区别是apply放不了字典

# 更详细的取值
s.split(' ')[1].split('室')[0] # 即可取出卧室数,用float即可获取数字
data['名称'].map(lambda x:s.split(' ')[1].split('室')[0]) # 完全获取