目录
- 5.1 数据清理的概述
- 5.1.1 常见的三种数据问题
- 5.1.2 常见三种数据问题的处理办法
- 5.2 缺失值的检测与处理
- 5.2.1 缺失值的检测
- 5.2.2 缺失值的处理
- 5.2.2.1 丢弃有缺失值的数据记录
- 5.2.2.2 填充记录的缺失值
- 5.2.2.3 插补记录的缺失值
- 5.3 重复值处理
- 5.3.1 重复值的检测
- 5.3.2 重复值的处理
- 5.4 异常值的处理:
- 5.4.1 异常值的检测
- 5.4.1.1 3σ原则
- 5.4.1.2 箱形图异常值检测。
- 5.4.1.2.1 箱形图的绘制。
- 5.4.1.2.2 利用箱形图检测异常值
- 5.4.2 异常值的处理
- 5.4.2.1 删除异常值
- 5.4.2.2 替换异常值
- 5.4.2.3 补充对pandas的.replace()方法详解
- 5.4.2.3.1 替换全部的某个值
- 5.4.2.3.2 替换全部的多个值
- 5.4.2.3.3 替换某列里的内容,而不改变其它列
- 5.4.2.3.4 替换某行内容
- 5.4.2.3.5 使用正则表达式替换
- 5.4.2.3.6 使用条件替换
本文的jupyter notebook版本及数据资料文件下载地址 百度网盘
5.1 数据清理的概述
5.1.1 常见的三种数据问题
5.1.2 常见三种数据问题的处理办法
-
缺失值处理:
- 丢弃有缺失值的数据记录
- 填充记录的缺失值: 均值填充、中位数填充、众数填充、前值填充、后值填充
- 插补记录的缺失值。
-
重复值处理:
-
异常值的处理:
- 删除带异常值的记录
- 保留带异常值的记录
- 替换掉记录中的异常值
5.2 缺失值的检测与处理
5.2.1 缺失值的检测
pandas中通常用nan或者是none来代表缺失值。
常用的检测的方法有:
- isnull(): True则有缺失值
- notnull():False则有缺失值
- isna(): True则有缺失值
- notna(): False则有缺失值
import pandas as pd
import numpy as np
na_df = pd.DataFrame({'A':[1,2,np.NaN,4],
'B':[3,4,4,5],
'C':[5,6,7,8],
'D':[7,5,np.NaN, np.NaN]})
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
na_df.isnull()
|
A |
B |
C |
D |
0 |
False |
False |
False |
False |
1 |
False |
False |
False |
False |
2 |
True |
False |
False |
True |
3 |
False |
False |
False |
True |
na_df.notnull()
|
A |
B |
C |
D |
0 |
True |
True |
True |
True |
1 |
True |
True |
True |
True |
2 |
False |
True |
True |
False |
3 |
True |
True |
True |
False |
na_df.isna()
|
A |
B |
C |
D |
0 |
False |
False |
False |
False |
1 |
False |
False |
False |
False |
2 |
True |
False |
False |
True |
3 |
False |
False |
False |
True |
na_df.notna()
|
A |
B |
C |
D |
0 |
True |
True |
True |
True |
1 |
True |
True |
True |
True |
2 |
False |
True |
True |
False |
3 |
True |
True |
True |
False |
mr_df = na_df.isna()
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
mr_df
|
A |
B |
C |
D |
0 |
False |
False |
False |
False |
1 |
False |
False |
False |
False |
2 |
True |
False |
False |
True |
3 |
False |
False |
False |
True |
na_df[mr_df]
|
A |
B |
C |
D |
0 |
NaN |
NaN |
NaN |
NaN |
1 |
NaN |
NaN |
NaN |
NaN |
2 |
NaN |
NaN |
NaN |
NaN |
3 |
NaN |
NaN |
NaN |
NaN |
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
na_df>3
|
A |
B |
C |
D |
0 |
False |
False |
True |
True |
1 |
False |
True |
True |
True |
2 |
False |
True |
True |
False |
3 |
True |
True |
True |
False |
na_df[na_df>3]
|
A |
B |
C |
D |
0 |
NaN |
NaN |
5 |
7.0 |
1 |
NaN |
4.0 |
6 |
5.0 |
2 |
NaN |
4.0 |
7 |
NaN |
3 |
4.0 |
5.0 |
8 |
NaN |
5.2.2 缺失值的处理
5.2.2.1 丢弃有缺失值的数据记录
pandas中用dropna() 删除有缺失值的一行或者一列。
语法格式:
DataFrame.dropna(axis=0, how=‘any’, thresh=None, subset=None,inplace=False)
参数说明:
- axis:表示是否删除包含缺失值的行(axis=0)或列(axis=1)。
- how:表示删除缺失值的方式('any’表示存在任何一个空值则删除整行或列;‘all’表示所有都是空值时才删除)。
- thresh:表示保留至少有N个非NaN值的行或列。
- subset:表示删除指定列的缺失值。
- inplace:表示是否操作原数据。
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
na_df.dropna()
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
na_df.dropna(how='all')
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
na_df.dropna(axis=1)
|
B |
C |
0 |
3 |
5 |
1 |
4 |
6 |
2 |
4 |
7 |
3 |
5 |
8 |
na_df.dropna(thresh=3)
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
3 |
4.0 |
5 |
8 |
NaN |
na_df.dropna(axis=1,thresh=3)
|
A |
B |
C |
0 |
1.0 |
3 |
5 |
1 |
2.0 |
4 |
6 |
2 |
NaN |
4 |
7 |
3 |
4.0 |
5 |
8 |
new_df = na_df.dropna()
new_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
na_df.dropna(inplace=True)
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
import numpy as np
import pandas as pd
a = np.ones((11,10))
for i in range(len(a)):
a[i,:i] = np.nan
d = pd.DataFrame(data=a)
print(d)
0 1 2 3 4 5 6 7 8 9
0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1 NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
2 NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
3 NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
4 NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
5 NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
6 NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0
7 NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0
8 NaN NaN NaN NaN NaN NaN NaN NaN 1.0 1.0
9 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
print(d.dropna(axis='index', how='all', subset=[0,5,6,7]))
0 1 2 3 4 5 6 7 8 9
0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1 NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
2 NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
3 NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0 1.0
4 NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0 1.0
5 NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0 1.0
6 NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0 1.0
7 NaN NaN NaN NaN NaN NaN NaN 1.0 1.0 1.0
5.2.2.2 填充记录的缺失值
pandas中用fillna()进行缺失值的填充
语法格式:
DataFrame.fillna(value=None, method=None, axis=None, inplace=False,
limit=None, downcast=None)
参数说明:
- method:表示填充的方式,默认值为None。该参数还支持 'pad’或’ffill’和’backfill’或’bfill’几种取值
- 'pad’或’ffill’表示将最后一个有效值向后传播,也就是说使用缺失值前面的有效值填充缺失值;
- 'backfill’或’bfill’表示将最后一个有效值向前传播,也就是说使用缺失值后面的有效值填充缺失值。
- limit:表示可以连续填充的最大数量。
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
np.mean(na_df['A'])
2.3333333333333335
col_a = np.around(np.mean(na_df['A']),1)
col_a
2.3
col_d = np.around(np.mean(na_df['D']),1)
col_d
6.0
na_df.fillna(value={'A':col_a,'D':col_d})
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
2.3 |
4 |
7 |
6.0 |
3 |
4.0 |
5 |
8 |
6.0 |
na_df.fillna(value={'A':1000,'D':9999})
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
1000.0 |
4 |
7 |
9999.0 |
3 |
4.0 |
5 |
8 |
9999.0 |
na_df.fillna(8888)
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
8888.0 |
4 |
7 |
8888.0 |
3 |
4.0 |
5 |
8 |
8888.0 |
na_df
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
NaN |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
na_df.fillna(method='ffill')
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
2.0 |
4 |
7 |
5.0 |
3 |
4.0 |
5 |
8 |
5.0 |
na_df.fillna(method='bfill')
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
4.0 |
4 |
7 |
NaN |
3 |
4.0 |
5 |
8 |
NaN |
5.2.2.3 插补记录的缺失值
pandas中提供了插补缺失值的方法interpolate(),interpolate() 会根据相应的插值方法求得的值进行填充。
语法格式:
DataFrame.interpolate(method=‘linear’, axis=0, limit=None, inplace=False,
limit_direction=None, limit_area=None, downcast=None, **kwargs)
参数说明:
- method:表示使用的插值方法,该参数支持’linear’(默认值)、‘time’、 ‘index’、‘values’、 ‘nearest’ 、'barycentric’共6种取值,
- 'linear’代表采用线性插值法进行填充;
- 'time’代表根据时间长短进行填充;
- ‘index’、'values’代表采用索引的实际数值进行填充;
- ‘nearest’代表采用最临近插值法进行填充;’
- barycentric’代表采用重心坐标插值法进行填充。
- limit_direction:表示按照指定方向对连续的NaN进行填充。
na_df.interpolate(method='linear')
|
A |
B |
C |
D |
0 |
1.0 |
3 |
5 |
7.0 |
1 |
2.0 |
4 |
6 |
5.0 |
2 |
3.0 |
4 |
7 |
5.0 |
3 |
4.0 |
5 |
8 |
5.0 |
例子练习
txtData = pd.read_csv("cj.txt",sep="\t")
txtData
|
学号 |
班级 |
姓名 |
性别 |
英语 |
体育 |
军训 |
数分 |
高代 |
解几 |
0 |
2308024241 |
23080242 |
成龙 |
男 |
76 |
78 |
77 |
40 |
23 |
60 |
1 |
2308024244 |
23080242 |
周怡 |
女 |
66 |
91 |
75 |
47 |
47 |
44 |
2 |
2308024251 |
23080242 |
张波 |
男 |
85 |
81 |
75 |
45 |
45 |
60 |
3 |
2308024249 |
23080242 |
朱浩 |
男 |
65 |
50 |
80 |
72 |
62 |
71 |
4 |
2308024219 |
23080242 |
封印 |
女 |
73 |
88 |
92 |
61 |
47 |
46 |
5 |
2308024201 |
23080242 |
迟培 |
男 |
60 |
50 |
89 |
71 |
76 |
71 |
6 |
2308024347 |
23080243 |
李华 |
女 |
67 |
61 |
84 |
61 |
65 |
78 |
7 |
2308024307 |
23080243 |
陈田 |
男 |
76 |
79 |
86 |
69 |
40 |
69 |
8 |
2308024326 |
23080243 |
余皓 |
男 |
66 |
67 |
85 |
65 |
61 |
71 |
9 |
2308024320 |
23080243 |
李嘉 |
女 |
62 |
作弊 |
90 |
60 |
67 |
77 |
10 |
2308024342 |
23080243 |
李上初 |
男 |
76 |
90 |
84 |
60 |
66 |
60 |
11 |
2308024310 |
23080243 |
郭窦 |
女 |
79 |
67 |
84 |
64 |
64 |
79 |
12 |
2308024435 |
23080244 |
姜毅涛 |
男 |
77 |
71 |
缺考 |
61 |
73 |
76 |
13 |
2308024432 |
23080244 |
赵宇 |
男 |
74 |
74 |
88 |
68 |
70 |
71 |
14 |
2308024446 |
23080244 |
周路 |
女 |
76 |
80 |
77 |
61 |
74 |
80 |
15 |
2308024421 |
23080244 |
林建祥 |
男 |
72 |
72 |
81 |
63 |
90 |
75 |
16 |
2308024433 |
23080244 |
李大强 |
男 |
79 |
76 |
77 |
78 |
70 |
70 |
17 |
2308024428 |
23080244 |
李侧通 |
男 |
64 |
96 |
91 |
69 |
60 |
77 |
18 |
2308024402 |
23080244 |
王慧 |
女 |
73 |
74 |
93 |
70 |
71 |
75 |
19 |
2308024422 |
23080244 |
李晓亮 |
男 |
85 |
60 |
85 |
72 |
72 |
83 |
20 |
2308024201 |
23080242 |
迟培 |
男 |
60 |
50 |
89 |
71 |
76 |
71 |
txtData.info()
RangeIndex: 21 entries, 0 to 20
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 学号 21 non-null int64
1 班级 21 non-null int64
2 姓名 21 non-null object
3 性别 21 non-null object
4 英语 21 non-null int64
5 体育 21 non-null object
6 军训 21 non-null object
7 数分 21 non-null int64
8 高代 21 non-null int64
9 解几 21 non-null int64
dtypes: int64(6), object(4)
memory usage: 1.8+ KB
df = txtData
df['体育']=pd.to_numeric(df['体育'],errors='coerce')
df['军训']=pd.to_numeric(df['军训'],errors='coerce')
df
|
学号 |
班级 |
姓名 |
性别 |
英语 |
体育 |
军训 |
数分 |
高代 |
解几 |
0 |
2308024241 |
23080242 |
成龙 |
男 |
76 |
78.0 |
77.0 |
40 |
23 |
60 |
1 |
2308024244 |
23080242 |
周怡 |
女 |
66 |
91.0 |
75.0 |
47 |
47 |
44 |
2 |
2308024251 |
23080242 |
张波 |
男 |
85 |
81.0 |
75.0 |
45 |
45 |
60 |
3 |
2308024249 |
23080242 |
朱浩 |
男 |
65 |
50.0 |
80.0 |
72 |
62 |
71 |
4 |
2308024219 |
23080242 |
封印 |
女 |
73 |
88.0 |
92.0 |
61 |
47 |
46 |
5 |
2308024201 |
23080242 |
迟培 |
男 |
60 |
50.0 |
89.0 |
71 |
76 |
71 |
6 |
2308024347 |
23080243 |
李华 |
女 |
67 |
61.0 |
84.0 |
61 |
65 |
78 |
7 |
2308024307 |
23080243 |
陈田 |
男 |
76 |
79.0 |
86.0 |
69 |
40 |
69 |
8 |
2308024326 |
23080243 |
余皓 |
男 |
66 |
67.0 |
85.0 |
65 |
61 |
71 |
9 |
2308024320 |
23080243 |
李嘉 |
女 |
62 |
NaN |
90.0 |
60 |
67 |
77 |
10 |
2308024342 |
23080243 |
李上初 |
男 |
76 |
90.0 |
84.0 |
60 |
66 |
60 |
11 |
2308024310 |
23080243 |
郭窦 |
女 |
79 |
67.0 |
84.0 |
64 |
64 |
79 |
12 |
2308024435 |
23080244 |
姜毅涛 |
男 |
77 |
71.0 |
NaN |
61 |
73 |
76 |
13 |
2308024432 |
23080244 |
赵宇 |
男 |
74 |
74.0 |
88.0 |
68 |
70 |
71 |
14 |
2308024446 |
23080244 |
周路 |
女 |
76 |
80.0 |
77.0 |
61 |
74 |
80 |
15 |
2308024421 |
23080244 |
林建祥 |
男 |
72 |
72.0 |
81.0 |
63 |
90 |
75 |
16 |
2308024433 |
23080244 |
李大强 |
男 |
79 |
76.0 |
77.0 |
78 |
70 |
70 |
17 |
2308024428 |
23080244 |
李侧通 |
男 |
64 |
96.0 |
91.0 |
69 |
60 |
77 |
18 |
2308024402 |
23080244 |
王慧 |
女 |
73 |
74.0 |
93.0 |
70 |
71 |
75 |
19 |
2308024422 |
23080244 |
李晓亮 |
男 |
85 |
60.0 |
85.0 |
72 |
72 |
83 |
20 |
2308024201 |
23080242 |
迟培 |
男 |
60 |
50.0 |
89.0 |
71 |
76 |
71 |
df['体育'].mean()
72.75
df.fillna(value={'体育':df['体育'].mean(),'军训':df['军训'].min()})
|
学号 |
班级 |
姓名 |
性别 |
英语 |
体育 |
军训 |
数分 |
高代 |
解几 |
0 |
2308024241 |
23080242 |
成龙 |
男 |
76 |
78.00 |
77.0 |
40 |
23 |
60 |
1 |
2308024244 |
23080242 |
周怡 |
女 |
66 |
91.00 |
75.0 |
47 |
47 |
44 |
2 |
2308024251 |
23080242 |
张波 |
男 |
85 |
81.00 |
75.0 |
45 |
45 |
60 |
3 |
2308024249 |
23080242 |
朱浩 |
男 |
65 |
50.00 |
80.0 |
72 |
62 |
71 |
4 |
2308024219 |
23080242 |
封印 |
女 |
73 |
88.00 |
92.0 |
61 |
47 |
46 |
5 |
2308024201 |
23080242 |
迟培 |
男 |
60 |
50.00 |
89.0 |
71 |
76 |
71 |
6 |
2308024347 |
23080243 |
李华 |
女 |
67 |
61.00 |
84.0 |
61 |
65 |
78 |
7 |
2308024307 |
23080243 |
陈田 |
男 |
76 |
79.00 |
86.0 |
69 |
40 |
69 |
8 |
2308024326 |
23080243 |
余皓 |
男 |
66 |
67.00 |
85.0 |
65 |
61 |
71 |
9 |
2308024320 |
23080243 |
李嘉 |
女 |
62 |
72.75 |
90.0 |
60 |
67 |
77 |
10 |
2308024342 |
23080243 |
李上初 |
男 |
76 |
90.00 |
84.0 |
60 |
66 |
60 |
11 |
2308024310 |
23080243 |
郭窦 |
女 |
79 |
67.00 |
84.0 |
64 |
64 |
79 |
12 |
2308024435 |
23080244 |
姜毅涛 |
男 |
77 |
71.00 |
75.0 |
61 |
73 |
76 |
13 |
2308024432 |
23080244 |
赵宇 |
男 |
74 |
74.00 |
88.0 |
68 |
70 |
71 |
14 |
2308024446 |
23080244 |
周路 |
女 |
76 |
80.00 |
77.0 |
61 |
74 |
80 |
15 |
2308024421 |
23080244 |
林建祥 |
男 |
72 |
72.00 |
81.0 |
63 |
90 |
75 |
16 |
2308024433 |
23080244 |
李大强 |
男 |
79 |
76.00 |
77.0 |
78 |
70 |
70 |
17 |
2308024428 |
23080244 |
李侧通 |
男 |
64 |
96.00 |
91.0 |
69 |
60 |
77 |
18 |
2308024402 |
23080244 |
王慧 |
女 |
73 |
74.00 |
93.0 |
70 |
71 |
75 |
19 |
2308024422 |
23080244 |
李晓亮 |
男 |
85 |
60.00 |
85.0 |
72 |
72 |
83 |
20 |
2308024201 |
23080242 |
迟培 |
男 |
60 |
50.00 |
89.0 |
71 |
76 |
71 |
5.3 重复值处理
5.3.1 重复值的检测
pandas中使用duplicated()
方法来检测数据中的重复值。
语法格式:
DataFrame.duplicated(subset=None, keep=‘first’)
参数说明:
- subset:表示识别重复项的列索引或列索引序列,默认标识所有的列索引。
- keep:表示采用哪种方式保留重复项,该参数可以取值为’first’(默认值)、 'last '和 ‘False’.
- 'first’代表删除重复项,仅保留第一次出现的数据项;
- 'last '代表删除重复项,仅保留最后一次出现的数据项;
- 'False’表示所有相同的数据都被标记为重复项。
import pandas as pd
person_info = pd.DataFrame({'name':['刘婷婷','王淼','彭岩','刘华','刘华','周华'],
'age':[24,23,29,22,22,27],
'height':[162,165,175,175,175,178],
'gender':['女','女','男','男','男','男']})
person_info
|
name |
age |
height |
gender |
0 |
刘婷婷 |
24 |
162 |
女 |
1 |
王淼 |
23 |
165 |
女 |
2 |
彭岩 |
29 |
175 |
男 |
3 |
刘华 |
22 |
175 |
男 |
4 |
刘华 |
22 |
175 |
男 |
5 |
周华 |
27 |
178 |
男 |
person_info.duplicated()
0 False
1 False
2 False
3 False
4 True
5 False
dtype: bool
person_info.duplicated(keep='last')
0 False
1 False
2 False
3 True
4 False
5 False
dtype: bool
person_info.duplicated(keep=False)
0 False
1 False
2 False
3 True
4 True
5 False
dtype: bool
person_info.duplicated(subset=['height','gender'],keep=False)
0 False
1 False
2 True
3 True
4 True
5 False
dtype: bool
5.3.2 重复值的处理
重复值的一般处理方式是删除,pandas中使用drop_duplicates()
方法删除重复值。
语法格式:
DataFrame.drop_duplicates(subset=None, keep=‘first’, inplace=False,
ignore_index=False)
参数说明:
- keep:表示采用哪种方式保留重复项,该参数可以取值为’first’(默认值)、 'last ‘和’False’.
- 'first’代表删除重复项,仅保留第一次出现的数据项;
- 'last '代表删除重复项,仅保留最后一次出现的数据项;
- 'False’表示删除所有的重复项。
- inplace:表示是否放弃副本数据,返回新的数据,默认为False。
- ignore_index:表示是否对删除重复值后的对象的行索引重新排序,默认为Flase。
person_info
|
name |
age |
height |
gender |
0 |
刘婷婷 |
24 |
162 |
女 |
1 |
王淼 |
23 |
165 |
女 |
2 |
彭岩 |
29 |
175 |
男 |
3 |
刘华 |
22 |
175 |
男 |
4 |
刘华 |
22 |
175 |
男 |
5 |
周华 |
27 |
178 |
男 |
person_info.drop_duplicates()
|
name |
age |
height |
gender |
0 |
刘婷婷 |
24 |
162 |
女 |
1 |
王淼 |
23 |
165 |
女 |
2 |
彭岩 |
29 |
175 |
男 |
3 |
刘华 |
22 |
175 |
男 |
5 |
周华 |
27 |
178 |
男 |
person_info
|
name |
age |
height |
gender |
0 |
刘婷婷 |
24 |
162 |
女 |
1 |
王淼 |
23 |
165 |
女 |
2 |
彭岩 |
29 |
175 |
男 |
3 |
刘华 |
22 |
175 |
男 |
4 |
刘华 |
22 |
175 |
男 |
5 |
周华 |
27 |
178 |
男 |
person_info.drop_duplicates(ignore_index=True)
|
name |
age |
height |
gender |
0 |
刘婷婷 |
24 |
162 |
女 |
1 |
王淼 |
23 |
165 |
女 |
2 |
彭岩 |
29 |
175 |
男 |
3 |
刘华 |
22 |
175 |
男 |
4 |
周华 |
27 |
178 |
男 |
person_info.drop_duplicates(inplace=True,ignore_index=True)
person_info
|
name |
age |
height |
gender |
0 |
刘婷婷 |
24 |
162 |
女 |
1 |
王淼 |
23 |
165 |
女 |
2 |
彭岩 |
29 |
175 |
男 |
3 |
刘华 |
22 |
175 |
男 |
4 |
周华 |
27 |
178 |
男 |
person_info.drop_duplicates(subset=['height','gender'],keep=False,ignore_index=False)
|
name |
age |
height |
gender |
0 |
刘婷婷 |
24 |
162 |
女 |
1 |
王淼 |
23 |
165 |
女 |
4 |
周华 |
27 |
178 |
男 |
5.4 异常值的处理:
- 删除带异常值的记录
- 保留带异常值的记录
- 替换掉记录中的异常值
5.4.1 异常值的检测
5.4.1.1 3σ原则
3σ原则,又称为拉依达原则,它是先假设一组检测数据只含有随机误差,对该组数据进行计算处理得到标准偏差,按一定概率确定一个区间,凡是超过这个区间的误差不属于随机误差而是粗大误差,含有粗大误差范围内的数据(视为异常值)应予以剔除。
- 3σ原则并不适用于任意数据集,而只适用于符合或近似正态分布的数据集。
- 正态分布也称高斯分布,是统计学中十分重要的概率分布,它有两个比较重要的参数:μ和σ,其中μ是遵从正态分布的随机变量(值无法预先确定仅以一定的概率取值的变量)的均值,σ是此随机变量的标准差。
实例:3σ原则检测数据data.xlsx里面的异常值
import numpy as np
import pandas as pd
def three_sigma(ser):
"""
ser参数:被检测的数据,是一个Series
返回值:异常值及其对应的行索引
"""
mean_data = ser.mean()
std_data = ser.std()
rule = ((mean_data-3*std_data)>ser) | ((mean_data+3*std_data)<ser)
index = np.arange(ser.shape[0])[rule]
outliers = ser.iloc[index]
return outliers
excel_data = pd.read_excel('data.xlsx',index_col=0)
excel_data
|
value |
0 |
12.7 |
1 |
9.9 |
2 |
10.2 |
3 |
10.6 |
4 |
8.6 |
... |
... |
995 |
10.3 |
996 |
10.1 |
997 |
10.0 |
998 |
9.3 |
999 |
9.9 |
1000 rows × 1 columns
three_sigma(excel_data['value'])
121 13.2
710 13.1
Name: value, dtype: float64
5.4.1.2 箱形图异常值检测。
除了使用3σ原则检测异常值之外,还可以使用箱形图检测异常值。
需要说明的是,箱形图对检测数据没有任何要求,即使不符合正态分布的数据集是能被检测的。
箱形图是一种用于显示一组数据分散情况的统计图,它通常由上边缘、上四分位数、中位数、下四分位数、下边缘和异常值组成。箱形图能直观地反映出一组数据的分散情况,一旦图中出现离群点(远离大多数值的点),就认为该离群点可能为异常值。
5.4.1.2.1 箱形图的绘制。
为了能够直观地从箱形图中查看异常值,pandas中提供了两个绘制箱形图的函数:plot()
和boxplot()
,其中plot()函数用于根据Series和DataFrame类对象绘制箱形图,该箱形图中默认不会显示网格线; boxplot()函数用于根据DataFrame类对象绘制箱形图,该箱形图中默认会显示网格线。
语法格式:。
DataFrame.boxplot(column=None, by=None, ax=None, fontsize=None,
rot=0, grid=True, figsize=None, layout=None, return_type=None,
backend=None, **kwargs)
参数说明:
- column,默认为None,输入为str 或由str构成的list,其作用是指定要进行箱型图分析的列
- by,默认为None,str or array-like,其作用为pandas的group by,通过指定by=‘columns’,可进行多组合箱型图分析
- ax,matplotlib.axes.Axes的对象,没有太大作用
- fontsize,箱型图坐标轴字体大小
- rot,箱型图坐标轴旋转角度
- grid,箱型图网格线是否显示
- figsize,箱型图窗口尺寸大小
- layout,必须配合by 一起使用,类似于subplot 的画布分区域功能
- return_type,指定返回对象的类型,默认为None,可输入的参数为‘axes’,‘dict’,‘both’,当与by一起使用是,返回的对象为Series或array(for return_type = None)
import pandas as pd
excel_data = pd.read_excel('data.xlsx',index_col=0)
excel_data.boxplot(column='value')
5.4.1.2.2 利用箱形图检测异常值
import pandas as pd
import numpy as np
def box_outliers(ser):
new_ser = ser.sort_values()
if new_ser.count() %2==0:
Q3 = new_ser[int(len(new_ser)/2):].median()
Q1 = new_ser[:int(len(new_ser)/2)].median()
else:
Q3 = new_ser[int((len(new_ser)-1)/2):].median()
Q1 = new_ser[:int((len(new_ser)-1)/2)].median()
IQR = round(Q3-Q1,1)
rule = (round(Q3+1.5*IQR,1)<ser)|(round(Q1-1.5*IQR,1)>ser)
index = np.arange(ser.shape[0])[rule]
outliers = ser.iloc[index]
return outliers
excel_data = pd.read_excel('data.xlsx',index_col=0)
box_outliers(excel_data['value'])
0 12.7
121 13.2
255 12.7
353 13.0
694 12.8
710 13.1
724 12.9
Name: value, dtype: float64
5.4.2 异常值的处理
异常值被检测出来之后,需要进一步确认其是否为真正的异常值,等确认完之后再选用合适的方式进行处理。异常值有3种处理方式,分别为:
5.4.2.1 删除异常值
pandas中提供了删除数据的drop()方法,使用该方法可以根据指定的行标签索引或列标签索引来删除异常值。
语法格式:
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None,
inplace=False, errors=‘raise’)
参数说明:
- labels:表示要删除行标签索引或列标签索引,可以是一个或多个。
- axis:指定删除行或删除列,其中0或index表示删除行;1或columns表示删除列。
- index:指定要删除的行。
- columns:指定要删除的列。
clean_data = excel_data.drop([121,710])
three_sigma(clean_data['value'])
Series([], Name: value, dtype: float64)
5.4.2.2 替换异常值
pandas中提供了替换值的replace()方法,replace()方法可以对单个或多个值进行替换。
语法格式:
DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=‘pad’)
参数说明:
- to_replace:被替换的值
- value:替换后的值
- inplace:是否要改变原数据,False是不改变,True是改变,默认是False
- limit:控制填充次数
- regex:是否使用正则,False是不使用,True是使用,默认是False
- method:填充方式,pad,ffill,bfill分别是向前、向前、向后填充。
“”“
0 12.7
121 13.2
255 12.7
353 13.0
694 12.8
710 13.1
724 12.9
”“”
replace_data = excel_data.replace({13.2:10.2,13.1:10.5})
print(replace_data.loc[121])
value 10.2
Name: 121, dtype: float64
print(replace_data.loc[710])
value 10.5
Name: 710, dtype: float64
box_outliers(replace_data['value'])
0 12.7
255 12.7
353 13.0
694 12.8
724 12.9
Name: value, dtype: float64
5.4.2.3 补充对pandas的.replace()方法详解
0. 准备数据
import requests
import pandas as pd
html_data = requests.get("http://www.weather.com.cn/textFC/hb.shtml")
html_tables = pd.read_html(html_data.content,header=0)
tqDf = html_tables[5]
tqDf
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
西南风 <3级 |
28 |
晴 |
西南风 <3级 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
西南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 <3级 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
西南风 <3级 |
27 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
tqDf.columns
Index(['省/直辖市', '城市', '周二(4月19日)白天', '周二(4月19日)白天.1', '周二(4月19日)白天.2',
'周二(4月19日)夜间', '周二(4月19日)夜间.1', '周二(4月19日)夜间.2', 'Unnamed: 8'],
dtype='object')
5.4.2.3.1 替换全部的某个值
replace的基本结构是:python df.replace(to_replace, value)
前面是需要替换的值,后面是替换后的值。
tqDf.replace("西南风 <3级","微风")
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
微风 |
28 |
晴 |
微风 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
西南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
微风 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
微风 |
27 |
晴 |
微风 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
微风 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
微风 |
27 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
要注意这样的操作并没有改变文档的源数据,要改变源数据需要使用inplace = True
5.4.2.3.2 替换全部的多个值
- 采用字典的形式,字典的key是要替换的值,value是替换后的值
- 采用列表的形式,前面列表保存原值,后面列表保存新值。
tqDf.replace({"西南风 <3级":"微风","西南风 3-4级":"小风"})
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
微风 |
27 |
晴 |
小风 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
小风 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
微风 |
27 |
晴 |
小风 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
小风 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
微风 |
28 |
晴 |
微风 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
微风 |
27 |
晴 |
小风 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
小风 |
27 |
晴 |
小风 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
微风 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
微风 |
27 |
晴 |
小风 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
微风 |
27 |
晴 |
微风 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
微风 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
微风 |
27 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
微风 |
27 |
晴 |
小风 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
小风 |
13 |
详情 |
tqDf.replace(["西南风 <3级","西南风 3-4级"],["微风","小风"])
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
微风 |
27 |
晴 |
小风 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
小风 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
微风 |
27 |
晴 |
小风 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
小风 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
微风 |
28 |
晴 |
微风 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
微风 |
27 |
晴 |
小风 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
小风 |
27 |
晴 |
小风 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
微风 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
微风 |
27 |
晴 |
小风 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
微风 |
27 |
晴 |
微风 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
微风 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
微风 |
27 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
微风 |
27 |
晴 |
小风 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
小风 |
13 |
详情 |
5.4.2.3.3 替换某列里的内容,而不改变其它列
tmpDf = tqDf.copy()
tmpDf['周二(4月19日)白天.1'].replace("西南风 <3级","微风",inplace=True)
tmpDf
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
微风 |
28 |
晴 |
西南风 <3级 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
西南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
微风 |
27 |
晴 |
西南风 <3级 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
微风 |
27 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5.4.2.3.4 替换某行内容
tmpDf = tqDf.copy()
tmpDf.iloc[3].replace("西南风 <3级","微风",inplace=True)
tmpDf
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
西南风 <3级 |
28 |
晴 |
西南风 <3级 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
西南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 <3级 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
西南风 <3级 |
27 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
tmpDf = tqDf.copy()
tmpDf.iloc[3:6].replace("西南风 <3级","微风",inplace=True)
tmpDf
D:\ProgramFiles\Anaconda3\lib\site-packages\pandas\core\frame.py:5244: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
method=method,
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
微风 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
微风 |
28 |
晴 |
微风 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
西南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 <3级 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
西南风 <3级 |
27 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5.4.2.3.5 使用正则表达式替换
正则表达式很强大,能够让我们实现一次替换很多很多个不同的值
tmpDf = tqDf.copy()
tmpDf.replace("[2][78]","高温", regex = True, inplace = True)
tmpDf
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
西南风 <3级 |
高温 |
晴 |
西南风 3-4级 |
13 |
详情 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
高温 |
晴 |
西南风 3-4级 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
西南风 <3级 |
高温 |
晴 |
西南风 3-4级 |
11 |
详情 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
高温 |
晴 |
西南风 3-4级 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
西南风 <3级 |
高温 |
晴 |
西南风 <3级 |
10 |
详情 |
6 |
北京 |
通州 |
晴 |
西南风 <3级 |
高温 |
晴 |
西南风 3-4级 |
11 |
详情 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
高温 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
西南风 3-4级 |
高温 |
晴 |
西南风 3-4级 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
西南风 <3级 |
高温 |
晴 |
西南风 3-4级 |
12 |
详情 |
12 |
北京 |
房山 |
晴 |
西南风 <3级 |
高温 |
晴 |
西南风 <3级 |
12 |
详情 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
高温 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
西南风 <3级 |
高温 |
晴 |
南风 <3级 |
11 |
详情 |
16 |
北京 |
东城 |
晴 |
西南风 <3级 |
高温 |
晴 |
西南风 3-4级 |
11 |
详情 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
高温 |
晴 |
西南风 3-4级 |
13 |
详情 |
5.4.2.3.6 使用条件替换
tmpDf = tqDf.copy()
tmpDf.loc[tmpDf["周二(4月19日)白天.1"]=="西南风 <3级","Unnamed: 8"]="西南风,微风"
tmpDf
|
省/直辖市 |
城市 |
周二(4月19日)白天 |
周二(4月19日)白天.1 |
周二(4月19日)白天.2 |
周二(4月19日)夜间 |
周二(4月19日)夜间.1 |
周二(4月19日)夜间.2 |
Unnamed: 8 |
0 |
省/直辖市 |
城市 |
天气现象 |
风向风力 |
最高气温 |
天气现象 |
风向风力 |
最低气温 |
NaN |
1 |
北京 |
北京 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
西南风,微风 |
2 |
北京 |
海淀 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
3 |
北京 |
朝阳 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
西南风,微风 |
4 |
北京 |
顺义 |
晴 |
南风 <3级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |
5 |
北京 |
怀柔 |
晴 |
西南风 <3级 |
28 |
晴 |
西南风 <3级 |
10 |
西南风,微风 |
6 |
北京 |
通州 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
西南风,微风 |
7 |
北京 |
昌平 |
晴 |
南风 <3级 |
28 |
晴 |
北风 <3级 |
11 |
详情 |
8 |
北京 |
延庆 |
晴 |
西风 <3级 |
24 |
晴 |
西风 <3级 |
8 |
详情 |
9 |
北京 |
丰台 |
晴 |
西南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
12 |
详情 |
10 |
北京 |
石景山 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
11 |
北京 |
大兴 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
12 |
西南风,微风 |
12 |
北京 |
房山 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 <3级 |
12 |
西南风,微风 |
13 |
北京 |
密云 |
晴 |
南风 <3级 |
27 |
晴 |
东南风 <3级 |
10 |
详情 |
14 |
北京 |
门头沟 |
晴 |
南风 3-4级 |
26 |
晴 |
西南风 <3级 |
12 |
详情 |
15 |
北京 |
平谷 |
晴 |
西南风 <3级 |
27 |
晴 |
南风 <3级 |
11 |
西南风,微风 |
16 |
北京 |
东城 |
晴 |
西南风 <3级 |
27 |
晴 |
西南风 3-4级 |
11 |
西南风,微风 |
17 |
北京 |
西城 |
晴 |
南风 3-4级 |
27 |
晴 |
西南风 3-4级 |
13 |
详情 |