数据筛选函数
函数 |
解释 |
loc |
根据行列名筛选数据,第一个参数是行名,第二个参数是列名 |
iloc |
根据行列号筛选数据,第一个参数是行号,第二个参数是列号 |
isin() |
传入一个列表,判断DadaFrame或者Series是否包含列表中的元素 |
between() |
筛选区间内的数据,只能作用于Series |
unique() |
筛选不重复的数据(去重),只能作用于Series |
nlargest() |
筛选前n个最大的数据,只能作用于Series |
nsmallest() |
筛选前n份最小的数据,只能作用于Series |
student = {
'学号':['001','002','003','004','005','006','007','008','009','010'],
'语文':[103,99,111,87,121,132,114,100,107,101],
'数学':[88,92,145,78,111,120,66,99,112,103],
'英语':[127,100,99,46,68,98,88,111,102,93],
'理综':[203,199,236,198,222,276,183,193,231,198]
}
pd.set_option('display.float_format', lambda x: '%.2f' % x)
df = pd.DataFrame(student)
from copy import deepcopy
df1 = deepcopy(df)
df1.index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k']
|
学号 |
语文 |
数学 |
英语 |
理综 |
a |
001 |
103 |
88 |
127 |
203 |
b |
002 |
99 |
92 |
100 |
199 |
c |
003 |
111 |
145 |
99 |
236 |
d |
004 |
87 |
78 |
46 |
198 |
e |
005 |
121 |
111 |
68 |
222 |
f |
006 |
132 |
120 |
98 |
276 |
g |
007 |
114 |
66 |
88 |
183 |
h |
008 |
100 |
99 |
111 |
193 |
j |
009 |
107 |
112 |
102 |
231 |
k |
010 |
101 |
103 |
93 |
198 |
df1.loc['b', '学号']
Out[9]:
'002'
df1.iloc[1]
Out[10]:
学号 002
语文 99
数学 92
英语 100
理综 199
Name: b, dtype: object
df1.isin([198,11])
df1[df1['数学'].between(100,130)]
Out[14]:
学号 语文 数学 英语 理综
e 005 121 111 68 222
f 006 132 120 98 276
j 009 107 112 102 231
k 010 101 103 93 198
df1['理综'].unique()
Out[12]:
array([203, 199, 236, 198, 222, 276, 183, 193, 231], dtype=int64)
df1['数学'].nlargest(3)
Out[16]:
c 145
f 120
j 112
Name: 数学, dtype: int64
df1['数学'].nsmallest(3)
Out[21]:
g 66
d 78
a 88
Name: 数学, dtype: int64
数据清洗函数
拼接
函数 |
|
merge |
根据共同列或者索引进行合并,可以取内连接,左连接、右连接、外连接等,类似sql中join操作 |
join |
主要用于以索引作为连接键来合并对象 |
concat |
根据索引进行行或列的拼接,只能取行或列的交集或并集 |
append |
相当于concat的垂直拼接 |
student = {
'学号':['011','012','013','014','015'],
'语文':[111,109,94,121,87],
'数学':[88,92,145,78,103],
'英语':[68,98,88,111,102],
}
df2 = pd.DataFrame(student)
concat
常用参数说明
参数 |
说明 |
objs |
必须要传入的参数,参与连接的对象 |
axis |
拼接的方向(轴),默认为0。0表示按行拼接,即垂直拼接;1表示按列拼接,即水平拼接 |
join |
有两个可选值:‘inner’(取交集)、‘outer’(取并集),表示其他轴向上的索引取交集还是并集,默认为’outer’ |
ignore_index |
不保留原来的索引,生成新的索引,默认为False |
sort |
是否需要排序,默认None,若是垂直拼接时,需指明Ture or False |
pd.concat([df, df2],sort=False)
|
学号 |
语文 |
数学 |
英语 |
理综 |
0 |
001 |
103 |
88 |
127 |
203.00 |
1 |
002 |
99 |
92 |
100 |
199.00 |
2 |
003 |
111 |
145 |
99 |
236.00 |
3 |
004 |
87 |
78 |
46 |
198.00 |
4 |
005 |
121 |
111 |
68 |
222.00 |
5 |
006 |
132 |
120 |
98 |
276.00 |
6 |
007 |
114 |
66 |
88 |
183.00 |
7 |
008 |
100 |
99 |
111 |
193.00 |
8 |
009 |
107 |
112 |
102 |
231.00 |
9 |
010 |
101 |
103 |
93 |
198.00 |
0 |
011 |
111 |
88 |
68 |
nan |
1 |
012 |
109 |
92 |
98 |
nan |
2 |
013 |
94 |
145 |
88 |
nan |
3 |
014 |
121 |
78 |
111 |
nan |
4 |
015 |
87 |
103 |
102 |
nan |
pd.concat([df, df2], axis=1)
|
学号 |
语文 |
数学 |
英语 |
理综 |
学号 |
语文 |
数学 |
英语 |
0 |
001 |
103 |
88 |
127 |
203 |
011 |
111.00 |
88.00 |
68.00 |
1 |
002 |
99 |
92 |
100 |
199 |
012 |
109.00 |
92.00 |
98.00 |
2 |
003 |
111 |
145 |
99 |
236 |
013 |
94.00 |
145.00 |
88.00 |
3 |
004 |
87 |
78 |
46 |
198 |
014 |
121.00 |
78.00 |
111.00 |
4 |
005 |
121 |
111 |
68 |
222 |
015 |
87.00 |
103.00 |
102.00 |
5 |
006 |
132 |
120 |
98 |
276 |
NaN |
nan |
nan |
nan |
6 |
007 |
114 |
66 |
88 |
183 |
NaN |
nan |
nan |
nan |
7 |
008 |
100 |
99 |
111 |
193 |
NaN |
nan |
nan |
nan |
8 |
009 |
107 |
112 |
102 |
231 |
NaN |
nan |
nan |
nan |
9 |
010 |
101 |
103 |
93 |
198 |
NaN |
nan |
nan |
nan |
pd.concat([df, df2], ignore_index=True, sort=False)
|
学号 |
语文 |
数学 |
英语 |
理综 |
0 |
001 |
103 |
88 |
127 |
203.00 |
1 |
002 |
99 |
92 |
100 |
199.00 |
2 |
003 |
111 |
145 |
99 |
236.00 |
3 |
004 |
87 |
78 |
46 |
198.00 |
4 |
005 |
121 |
111 |
68 |
222.00 |
5 |
006 |
132 |
120 |
98 |
276.00 |
6 |
007 |
114 |
66 |
88 |
183.00 |
7 |
008 |
100 |
99 |
111 |
193.00 |
8 |
009 |
107 |
112 |
102 |
231.00 |
9 |
010 |
101 |
103 |
93 |
198.00 |
10 |
011 |
111 |
88 |
68 |
nan |
11 |
012 |
109 |
92 |
98 |
nan |
12 |
013 |
94 |
145 |
88 |
nan |
13 |
014 |
121 |
78 |
111 |
nan |
14 |
015 |
87 |
103 |
102 |
nan |
pd.concat([df, df2], axis=1, join='inner')
|
学号 |
语文 |
数学 |
英语 |
理综 |
学号 |
语文 |
数学 |
英语 |
0 |
001 |
103 |
88 |
127 |
203 |
011 |
111 |
88 |
68 |
1 |
002 |
99 |
92 |
100 |
199 |
012 |
109 |
92 |
98 |
2 |
003 |
111 |
145 |
99 |
236 |
013 |
94 |
145 |
88 |
3 |
004 |
87 |
78 |
46 |
198 |
014 |
121 |
78 |
111 |
4 |
005 |
121 |
111 |
68 |
222 |
015 |
87 |
103 |
102 |
merge
常用参数说明
参数 |
说明 |
left |
参与连接的左侧对象 |
right |
参与连接的右侧对象 |
how |
连接的方式,可选参数有:‘inner’:内连接、‘outer’:外连接、‘left’:‘左外连接’、‘right’:‘右外连接’ |
on |
指明连接的列名,必须是两边都存在的列名。如果未指明,且其他连接键也未指定,则以left和right列名的交集作为连接键 |
left_on |
左侧DataFrame中用作连接键的列 |
right_on |
右侧DataFrame中用作连接键的列 |
left_index |
将左侧的行索引用作其连接键,默认False |
right_index |
类似于left_index |
sort |
根据连接键对合并后的数据进行排序,默认False |
suffixes |
字符串值元组,用于追加到重叠列名的末尾,默认为('_x','_y' )。 |
参考资料:https://blog.csdn.net/Asher117/article/details/84725199
pd.merge(df, df2,on=['数学'])
|
学号_x |
语文_x |
数学 |
英语_x |
理综 |
学号_y |
语文_y |
英语_y |
0 |
001 |
103 |
88 |
127 |
203 |
011 |
111 |
68 |
1 |
002 |
99 |
92 |
100 |
199 |
012 |
109 |
98 |
2 |
003 |
111 |
145 |
99 |
236 |
013 |
94 |
88 |
3 |
004 |
87 |
78 |
46 |
198 |
014 |
121 |
111 |
4 |
010 |
101 |
103 |
93 |
198 |
015 |
87 |
102 |
- 基于不同列名连接(当列名不同,意义相同时,可采用此方案)
pd.merge(df, df2, left_on=['数学'], right_on=['语文'])
|
学号_x |
语文_x |
数学_x |
英语_x |
理综 |
学号_y |
语文_y |
数学_y |
英语_y |
0 |
005 |
121 |
111 |
68 |
222 |
011 |
111 |
88 |
68 |
pd.merge(df, df2, how='outer')
|
学号 |
语文 |
数学 |
英语 |
理综 |
0 |
001 |
103 |
88 |
127 |
203.00 |
1 |
002 |
99 |
92 |
100 |
199.00 |
2 |
003 |
111 |
145 |
99 |
236.00 |
3 |
004 |
87 |
78 |
46 |
198.00 |
4 |
005 |
121 |
111 |
68 |
222.00 |
5 |
006 |
132 |
120 |
98 |
276.00 |
6 |
007 |
114 |
66 |
88 |
183.00 |
7 |
008 |
100 |
99 |
111 |
193.00 |
8 |
009 |
107 |
112 |
102 |
231.00 |
9 |
010 |
101 |
103 |
93 |
198.00 |
10 |
011 |
111 |
88 |
68 |
nan |
11 |
012 |
109 |
92 |
98 |
nan |
12 |
013 |
94 |
145 |
88 |
nan |
13 |
014 |
121 |
78 |
111 |
nan |
14 |
015 |
87 |
103 |
102 |
nan |
pd.merge(df, df2, how='left')
|
学号 |
语文 |
数学 |
英语 |
理综 |
0 |
001 |
103 |
88 |
127 |
203 |
1 |
002 |
99 |
92 |
100 |
199 |
2 |
003 |
111 |
145 |
99 |
236 |
3 |
004 |
87 |
78 |
46 |
198 |
4 |
005 |
121 |
111 |
68 |
222 |
5 |
006 |
132 |
120 |
98 |
276 |
6 |
007 |
114 |
66 |
88 |
183 |
7 |
008 |
100 |
99 |
111 |
193 |
8 |
009 |
107 |
112 |
102 |
231 |
9 |
010 |
101 |
103 |
93 |
198 |
df2.index = df2.index+100
pd.merge(df, df2, left_on='数学', right_index=True)
|
数学 |
学号_x |
语文_x |
数学_x |
英语_x |
理综 |
学号_y |
语文_y |
数学_y |
英语_y |
9 |
103 |
010 |
101 |
103 |
93 |
198 |
014 |
121 |
78 |
111 |
join
常用参数说明
参数 |
说明 |
other |
右边的对象 |
on |
如果右表的索引值正是左表的某一列的值,变会将对应的索引与列名作为连接值去合并 |
how |
与merge中how意义一样,默认为left |
lsuffix |
左后缀,若两个表有相同列名时必须要指明 |
rsuffix |
同rsuffix |
sort |
与merge中sort意义一样 |
df2.index = df2.index-100
df.join(df2, lsuffix='_l', rsuffix='_r', how='inner')
|
学号_l |
语文_l |
数学_l |
英语_l |
理综 |
学号_r |
语文_r |
数学_r |
英语_r |
0 |
001 |
103 |
88 |
127 |
203 |
011 |
111 |
88 |
68 |
1 |
002 |
99 |
92 |
100 |
199 |
012 |
109 |
92 |
98 |
2 |
003 |
111 |
145 |
99 |
236 |
013 |
94 |
145 |
88 |
3 |
004 |
87 |
78 |
46 |
198 |
014 |
121 |
78 |
111 |
4 |
005 |
121 |
111 |
68 |
222 |
015 |
87 |
103 |
102 |
缺失值、重复值处理
函数 |
解释 |
duplicated() |
元素是否有重复 |
drop_duplicates() |
删除重复值 |
isnull() |
元素是否缺失 |
dropna() |
删除缺失值 |
fillna() |
填充缺失值 |
ffill() |
使用缺失值前一个元素进行填充 |
bfill() |
使用缺失值后一个元素填充 |
notnull() |
元素是否不缺失 |
drop() |
删除列或行 |
df4 = df.append(df2,ignore_index=True)
df4.loc[15] = ['010',103,198,93,101]
|
学号 |
数学 |
理综 |
英语 |
语文 |
0 |
001 |
88 |
203.00 |
127 |
103 |
1 |
002 |
92 |
199.00 |
100 |
99 |
2 |
003 |
145 |
236.00 |
99 |
111 |
3 |
004 |
78 |
198.00 |
46 |
87 |
4 |
005 |
111 |
222.00 |
68 |
121 |
5 |
006 |
120 |
276.00 |
98 |
132 |
6 |
007 |
66 |
183.00 |
88 |
114 |
7 |
008 |
99 |
193.00 |
111 |
100 |
8 |
009 |
112 |
231.00 |
102 |
107 |
9 |
010 |
103 |
198.00 |
93 |
101 |
10 |
011 |
88 |
nan |
68 |
111 |
11 |
012 |
92 |
nan |
98 |
109 |
12 |
013 |
145 |
nan |
88 |
94 |
13 |
014 |
78 |
nan |
111 |
121 |
14 |
015 |
103 |
nan |
102 |
87 |
15 |
010 |
103 |
198.00 |
93 |
101 |
df4.duplicated()
Out[68]:
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
15 True
dtype: bool
df4.drop_duplicates(inplace=True)
|
学号 |
数学 |
理综 |
英语 |
语文 |
0 |
001 |
88 |
203.00 |
127 |
103 |
1 |
002 |
92 |
199.00 |
100 |
99 |
2 |
003 |
145 |
236.00 |
99 |
111 |
3 |
004 |
78 |
198.00 |
46 |
87 |
4 |
005 |
111 |
222.00 |
68 |
121 |
5 |
006 |
120 |
276.00 |
98 |
132 |
6 |
007 |
66 |
183.00 |
88 |
114 |
7 |
008 |
99 |
193.00 |
111 |
100 |
8 |
009 |
112 |
231.00 |
102 |
107 |
9 |
010 |
103 |
198.00 |
93 |
101 |
10 |
011 |
88 |
nan |
68 |
111 |
11 |
012 |
92 |
nan |
98 |
109 |
12 |
013 |
145 |
nan |
88 |
94 |
13 |
014 |
78 |
nan |
111 |
121 |
14 |
015 |
103 |
nan |
102 |
87 |
df4['理综'].isnull()
Out[83]:
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 True
11 True
12 True
13 True
14 True
15 False
Name: 理综, dtype: bool
df4['理综'].dropna()
Out[101]:
0 203.00
1 199.00
2 236.00
3 198.00
4 222.00
5 276.00
6 183.00
7 193.00
8 231.00
9 198.00
Name: 理综, dtype: float64
"""
做数据分析时,某一列或行缺失值或异常值过多时,可以考虑将此列或行删除掉
"""
df4.drop(['理综'], axis=1)
|
学号 |
数学 |
英语 |
语文 |
0 |
001 |
88 |
127 |
103 |
1 |
002 |
92 |
100 |
99 |
2 |
003 |
145 |
99 |
111 |
3 |
004 |
78 |
46 |
87 |
4 |
005 |
111 |
68 |
121 |
5 |
006 |
120 |
98 |
132 |
6 |
007 |
66 |
88 |
114 |
7 |
008 |
99 |
111 |
100 |
8 |
009 |
112 |
102 |
107 |
9 |
010 |
103 |
93 |
101 |
str & dt
data = {
'name':['张三','李四','王五'],
'city':['广东省&深圳市','湖北省&仙桃市','山西省&吕梁市'],
'birth':['2018-06-20','1995-07-11','2014-10-09']
}
df5 = pd.DataFrame(data)
|
name |
city |
birth |
0 |
张三 |
广东省&深圳市 |
20/06/2018 |
1 |
李四 |
湖北省&仙桃市 |
11/07/1995 |
2 |
王五 |
山西省&吕梁市 |
09/10/2014 |
相当于将数据转化为 string,进而可以使用string的一些方法
df5['city'] = df5['city'].str.replace('&','')
|
name |
city |
birth |
0 |
张三 |
广东省深圳市 |
2018-06-20 |
1 |
李四 |
湖北省仙桃市 |
1995-07-11 |
2 |
王五 |
山西省吕梁市 |
2014-10-09 |
用于日期处理,在使用dt之前,必须要使用to_datetime方法将数据转换成时间格式
日期处理的常用函数
函数 |
解释 |
dt.date |
日期值,年-月-日 |
dt.time |
时间,时分秒 |
dt.year |
年 |
dt.month |
月 |
df.day |
日 |
dt.hour |
小时 |
dt.minute |
分钟 |
dt.second |
秒 |
dt.quarter |
季度 |
dt.weekday |
星期几,阿拉伯数字(0到6) |
dt.weekday_name |
星期几,英文 |
dt.week |
一年中的第几周 |
dt.dayofyear |
一年中的第几天 |
dt.days_in_month |
当月最大天数 |
dt.is_mouth_start |
是否为当月的第一天 |
dt.is_mouth_end |
是否为当月的最后一天 |
dt.is_quarter_start |
是否为当季度的第一天 |
dt.is_quarter_end |
是否为当季度的最后一天 |
dt.is_year_start |
是否为当年的第一天 |
dt.is_year_end |
是否为当年的最后一天 |
dt.is_leap_year |
是否为闰年 |
pd.to_datetime(df5['birth'],format="%d/%m/%Y")
Out[132]:
0 2018-06-20
1 1995-07-11
2 2014-10-09
Name: birth, dtype: datetime64[ns]
pd.to_datetime(df5['birth'], format="%d/%m/%Y").dt.weekday_name
Out[133]:
0 Tuesday
1 Sunday
2 Monday
Name: birth, dtype: object