0%

数据挖掘知识点

数据挖掘过程中常用的操作

数据清洗

合并列表

1
data_wx = pd.concat([data_kdgd, data_pmsc, data_trn, data_clg]) # 自动填充空列

数据内容分割

1
2
3
4
5
6
7
8
9
10
df['area'].str.split("-", expand=True) # 按照“-”划分,如分割地点“省份-城市”

df['province'] = df['area'].str.split("-", expand=True)[0]
df['city'] = df['area'].str.split("-", expand=True)[1]

# 把北京、天津、上海、重庆的城市改为原来的名字
df.loc[df['province'] == '北京', 'city'] = '北京'
df.loc[df['province'] == '上海', 'city'] = '上海'
df.loc[df['province'] == '天津', 'city'] = '天津'
df.loc[df['province'] == '重庆', 'city'] = '重庆'

异常值处理

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
28
29
30
31
32
33
34
35
36
37
38
39
40
#识别空值
df.isnull()

#空值个数求和
df.isnull().sum()

#删去全部空值所在行
df.dropna()

#删除某一特征空值所在行
df.dropna(subset=["A"])

#识别某一特征重复值
df.duplicated(["A"])
df.duplicated(["A""B"]) #A、B均重复

#删去某一特征重复值
df.drop_duplicates(["A"])
df.drop_duplicates(["A"],keep="first") #默认 first (last\False)

#空值填充(自定义)
df.fillna("***")

#空值填充(均值)
df.fillna(df["A"].mean())

#空值填充(插值)
df["A"].interpolate()
pd.Series([1,None,4,5,20]).interpolate()

#用四分位数去除空值
upper_q=df["A"].quantile(0.75)
lower_q=df["A"].quantile(0.25)
q_int=upper_q-lower_q
k=1.5

df[df["A"]>lower_q-k*q_int][df["A"]<upper_q+k*q_int]

#利用条件删去空值
df[[True if item.startswith("f") else False for item in list(df["F"].values)]]

数据特证名替换

1
2
3
data_salary = pd.concat([data_wx[['salary_clean', 'teacher_type']],
data_jlc[['salary_clean', 'teacher_type']]])
data_salary.rename(columns={'salary_clean':'工资', 'teacher_type':'教师类型'}, inplace=True)

数据内容替换

1
2
3
4
5
6
7
data_wx['exp'].unique() # 检查取值空间

exp_map = {'不限':'经验不限', '一年以上':'一到三年', '三年以上':'三到五年', '两年以上':'一到三年',
'五年以上':'五到十年', '应届毕业生':'经验不限', '六年以上':'五到十年', '四年以上':'三到五年',
'九年以上':'五到十年', '七年以上':'五到十年', '十年以上':'十年以上', '在读学生':'经验不限',
'八年以上':'五到十年'}
data_wx['exp'] = data_wx['exp'].map(exp_map)

绘图

1
2
3
4
#结构化多绘图网格
# sns.set(font_scale=1.5)
g = sns.FacetGrid(data_salary, row="教师类型", size=4, aspect=2, xlim=(0,30))
g.map(sns.distplot, "工资", rug=False)

其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 工资分析
def get_salary(data):
pat_K = r"(.*)K-(.*)K"
pat_W = r"(.*)W-(.*)W"
pat = r"(.*)-(.*)/"
if '面议' in data:
return np.nan
if '享公办教师薪资待遇' in data:
return np.nan
if 'K' in data and '月' in data:
low, high = re.findall(pattern=pat_K, string=data)[0]
return (float(low)+float(high))/2
if 'W' in data and '年' in data:
low, high = re.findall(pattern=pat_W, string=data)[0]
return (float(low)+float(high))/2*10/12
if 'K' not in data and '月' in data:
low, high = re.findall(pattern=pat, string=data)[0]
return (float(low)+float(high))/2/1000

data_wx['salary_clean'] = data_wx['salary'].apply(get_salary)
data_wx['salary_clean'] = np.round(data_wx['salary_clean'], 1)