展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

Pandas基础使用(二):填充/空值处理/排序/替换/连接

填充

path = r"C:\work\python\pandas_files\数据统计.xlsx"
data = pd.read_excel(path,index_col=0)
print(data)
output
姓名 性别 语文 数学 英语
序号
1 张三 男 89 60 88
2 李四 女 60 71 98
3 王五 男 73 84 68
4 小孙 男 85 96 96
5 小刘 女 70 63 97
6 小赵 女 63 63 91
# 从前面开始获取指定数量的记录,默认5条记录
b = data.head(3)
print(b)
output
姓名 性别 语文 数学 英语
序号
1 张三 男 89 60 88
2 李四 女 60 71 98
3 王五 男 73 84 68
# 从后往前取指定的记录,默认5条
b = data.tail()
print(b)
output
# 从后往前取指定的记录,默认5条
b = data.tail()
print(b)
# 获取所有的记录,用二维数组的方式返回,可以通过下标进行访问
b = data.values
print(b)
output
[['张三' '男' 89 60 88]
['李四' '女' 60 71 98]
['王五' '男' 73 84 68]
['小孙' '男' 85 96 96]
['小刘' '女' 70 63 97]
['小赵' '女' 63 63 91]]
# 得到DataFrame的维度,不算索引列
b = data.shape
print(b)
output
(6, 5)
b = data.fillna(0) # 将所有的空值填充为0
print(b)
output
姓名 性别 语文 数学 英语
序号
1 张三 男 89 60 88
2 李四 女 60 71 98
3 王五 男 73 84 68
4 小孙 男 85 96 96
5 小刘 女 70 63 97
6 小赵 女 63 63 91
# 将性别列的空值填充为男
data['性别'] = data['性别'].fillna('男')
print(data)
output
姓名 性别 语文 数学 英语
序号
1 张三 男 89 60 88
2 李四 女 60 71 98
3 王五 男 73 84 68
4 小孙 男 85 96 96
5 小刘 女 70 63 97
6 小赵 女 63 63 91
# 将语文数学英语列的空值填充为0
data[['语文','数学','英语']] = data[['语文','数学','英语']].fillna(0)
print(data)
output
姓名 性别 语文 数学 英语
序号
1 张三 男 89 60 88
2 李四 女 60 71 98
3 王五 男 73 84 68
4 小孙 男 85 96 96
5 小刘 女 70 63 97
6 小赵 女 63 63 91
# 把所有的男替换成
b = data.replace('男','女')
print(b)
output
姓名 性别 语文 数学 英语
序号
1 张三 女 89 60 88
2 李四 女 60 71 98
3 王五 女 73 84 68
4 小孙 女 85 96 96
5 小刘 女 70 63 97
6 小赵 女 63 63 91
# 显示数据中的空值,如果为空就是True,否则False
b = data.isnull()
print(b)
output
姓名 性别 语文 数学 英语
序号
1 False False False False False
2 False False False False False
3 False False False False False
4 False False False False False
5 False False False False False
6 False False False False False
# 显示数据中的非空的值,如果非空就是True,否则False
b = data.notnull()
print(b)
output
姓名 性别 语文 数学 英语
序号
1 True True True True True
2 True True True True True
3 True True True True True
4 True True True True True
5 True True True True True
6 True True True True True
# 删除有空值的行
b = data.dropna()
print(b)
output
姓名 性别 语文 数学 英语
序号
1 张三 男 89 60 88
2 李四 女 60 71 98
3 王五 男 73 84 68
4 小孙 男 85 96 96
5 小刘 女 70 63 97
6 小赵 女 63 63 91
# 查看唯一值的数量
b = data.nunique()
print(b)
output
姓名 6
性别 2
语文 6
数学 5
英语 6
dtype: int64
# 转换索引列,
# drop=False 将索引列还原成普通列,默认
# drop=True 直接删除索引列
data = data.reset_index(drop=False)
print(data)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
1 2 李四 女 60 71 98
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
# 使用前面的值进行填充
b = data.fillna(method='ffill')
print(b)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
1 2 李四 女 60 71 98
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
# 使用后面的值进行填充
b = data.fillna(method='bfill')
print(b)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
1 2 李四 女 60 71 98
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
# 使用前面的值进行填充,最多填充2行
b = data.fillna(method='ffill', limit=2)
print(b)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
1 2 李四 女 60 71 98
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
# 等同于:data.fillna(method='ffill')
b = data.ffill()
# 等同于:data.fillna(method='bfill')
b = data.bfill()

空值处理

'''
data.dropna(参数)
axis=1 # 1-表示对列操作,0-对行操作,默认值
how # 与thresh二选一使用
how='any' # 只要出现NaN就删除整行或者整列数据
how='all' # 必须整行或整列所有的值都是NaN才删除
thresh # 与how二选一使用 【非空值】的数量必须达到指定数量,否则就删除
thresh=3 # 【非空值】的数量至少有3个,否则就删除
subset # 指定列处理NaN值
subset='英语1' # 针对英语1这列做空值处理
subset=['英语1','英语2'] # 针对两列做空值处理
'''
# 删除语文、英语这两列中任意一列有NaN值的行
b = data.dropna(subset=['语文','英语'])
print(b)
# 删除性别、语文这两列中同时出现NaN值的行
b = data.dropna(subset=['性别','语文'],how='all')
print(b)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
1 2 李四 女 60 71 98
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
1 2 李四 女 60 71 98
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91

排序

# 对索引降序排列,默认True升序
b = data.sort_index(ascending=False)
print(b)
output
序号 姓名 性别 语文 数学 英语
5 6 小赵 女 63 63 91
4 5 小刘 女 70 63 97
3 4 小孙 男 85 96 96
2 3 王五 男 73 84 68
1 2 李四 女 60 71 98
0 1 张三 男 89 60 88
# 对指定的列排序,语文升序
b = data.sort_values('语文',ascending=True)
print(b)
output
序号 姓名 性别 语文 数学 英语
1 2 李四 女 60 71 98
5 6 小赵 女 63 63 91
4 5 小刘 女 70 63 97
2 3 王五 男 73 84 68
3 4 小孙 男 85 96 96
0 1 张三 男 89 60 88
# 语文成绩降序排列,数学降序排列
b = data.sort_values(['语文','数学'],ascending=False)
print(b)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
3 4 小孙 男 85 96 96
2 3 王五 男 73 84 68
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
1 2 李四 女 60 71 98
# 语文成绩降序排列,数学升序排列
b = data.sort_values(['语文','数学'],ascending=[False,True])
print(b)
output
序号 姓名 性别 语文 数学 英语
0 1 张三 男 89 60 88
3 4 小孙 男 85 96 96
2 3 王五 男 73 84 68
4 5 小刘 女 70 63 97
5 6 小赵 女 63 63 91
1 2 李四 女 60 71 98

替换

path = r"C:\work\python\pandas_files\替换.xlsx"
data = pd.read_excel(path)
print(data)
output
国家 省市 城市 城市2 数值
0 中国 北京 城八区 城八区 100
1 中国 北京 城八区 城八区 A
2 中国 NaN 城八区 城八区 B
3 中国 北京 城八区 城八区 A
4 中国 北京 城八区 城八区 B
5 中国 北京 城八区 城八区 C
6 中国 北京 城八区 城八区 D
7 中国 北京 城八区 城八区 E
8 中国 北京 城八区 城八区 F
9 中国 北京 城八区 城八区 G
# 将所有的 城八区 替换成 无人区
data1 = data.replace("城八区","无人区")
print(data1)
output
国家 省市 城市 城市2 数值
0 中国 北京 无人区 无人区 100
1 中国 北京 无人区 无人区 A
2 中国 NaN 无人区 无人区 B
3 中国 北京 无人区 无人区 A
4 中国 北京 无人区 无人区 B
5 中国 北京 无人区 无人区 C
6 中国 北京 无人区 无人区 D
7 中国 北京 无人区 无人区 E
8 中国 北京 无人区 无人区 F
9 中国 北京 无人区 无人区 G
# 将城市2的 城八区 替换成 无人区
data['城市2'].replace('城八区',"无人区",inplace=True)
print(data)
output
国家 省市 城市 城市2 数值
0 中国 北京 城八区 无人区 100
1 中国 北京 城八区 无人区 A
2 中国 NaN 城八区 无人区 B
3 中国 北京 城八区 无人区 A
4 中国 北京 城八区 无人区 B
5 中国 北京 城八区 无人区 C
6 中国 北京 城八区 无人区 D
7 中国 北京 城八区 无人区 E
8 中国 北京 城八区 无人区 F
9 中国 北京 城八区 无人区 G
# 将数值列的A替换成100,B替换成80
data['数值'].replace(['A','B'],[100,80],inplace=True)
print(data)
output
国家 省市 城市 城市2 数值
0 中国 北京 城八区 无人区 100
1 中国 北京 城八区 无人区 100
2 中国 NaN 城八区 无人区 80
3 中国 北京 城八区 无人区 100
4 中国 北京 城八区 无人区 80
5 中国 北京 城八区 无人区 C
6 中国 北京 城八区 无人区 D
7 中国 北京 城八区 无人区 E
8 中国 北京 城八区 无人区 F
9 中国 北京 城八区 无人区 G
# 将数值列的A替换成100,B替换成80,字典来做
dic = {'A':100,'B':80}
data['数值'].replace(dic,inplace=True)
print(data)
output
国家 省市 城市 城市2 数值
0 中国 北京 城八区 无人区 100
1 中国 北京 城八区 无人区 100
2 中国 NaN 城八区 无人区 80
3 中国 北京 城八区 无人区 100
4 中国 北京 城八区 无人区 80
5 中国 北京 城八区 无人区 C
6 中国 北京 城八区 无人区 D
7 中国 北京 城八区 无人区 E
8 中国 北京 城八区 无人区 F
9 中国 北京 城八区 无人区 G
# 用正则表达式,将A-Z的字符替换成80
data['数值'].replace('[A-Z]',80,regex=True,inplace=True)
print(data)
output
国家 省市 城市 城市2 数值
0 中国 北京 城八区 无人区 100
1 中国 北京 城八区 无人区 100
2 中国 NaN 城八区 无人区 80
3 中国 北京 城八区 无人区 100
4 中国 北京 城八区 无人区 80
5 中国 北京 城八区 无人区 80
6 中国 北京 城八区 无人区 80
7 中国 北京 城八区 无人区 80
8 中国 北京 城八区 无人区 80
9 中国 北京 城八区 无人区 80

连接

dic1 = {
"姓名":['张三','李四','王五','赵六'],
"年龄" :[18,19,20,21],
"班级" :['一班','一班','二班','二班'],
"语文成绩":[80,90,100,99]
}
dic2 = {
"姓名":['张三','张三','王七','赵七'],
"年龄" :[18,19,20,21],
"班级" :['一班','二班','二班','二班'],
"数学成绩":[80,90,100,99]
}
data1 = pd.DataFrame(dic1)
data2 = pd.DataFrame(dic2)
print(data1)
print(data2)
output
姓名 年龄 班级 语文成绩
0 张三 18 一班 80
1 李四 19 一班 90
2 王五 20 二班 100
3 赵六 21 二班 99
姓名 年龄 班级 数学成绩
0 张三 18 一班 80
1 张三 19 二班 90
2 王七 20 二班 100
3 赵七 21 二班 99
# 默认连接
data3 = pd.merge(data1,data2)
print(data3)
output
姓名 年龄 班级 语文成绩 数学成绩
0 张三 18 一班 80 80
# 用姓名做连接
data3 = pd.merge(data1,data2,on='姓名')
print(data3)
output
姓名 年龄_x 班级_x 语文成绩 年龄_y 班级_y 数学成绩
0 张三 18 一班 80 18 一班 80
1 张三 18 一班 80 19 二班 90
# 用姓名、年龄、班级
data3 = pd.merge(data1,data2,on=['姓名','年龄','班级'])
print(data3)
output
姓名 年龄 班级 语文成绩 数学成绩
0 张三 18 一班 80 80
# 用年龄匹配
data3 = pd.merge(data1,data2,on='年龄')
print(data3)
output
姓名_x 年龄 班级_x 语文成绩 姓名_y 班级_y 数学成绩
0 张三 18 一班 80 张三 一班 80
1 李四 19 一班 90 张三 二班 90
2 王五 20 二班 100 王七 二班 100
3 赵六 21 二班 99 赵七 二班 99
# inner,默认连接方式,两个表都存在的数据才成立
data3 = pd.merge(data1,data2,on=['姓名','年龄','班级'],how='inner')
print(data3)
output
姓名 年龄 班级 语文成绩 数学成绩
0 张三 18 一班 80 80
# left,左表存在的都会成立,右表不存在就用NaN
data3 = pd.merge(data1,data2,on=['姓名','年龄','班级'],how='left')
print(data3)
output
姓名 年龄 班级 语文成绩 数学成绩
0 张三 18 一班 80 80.0
1 李四 19 一班 90 NaN
2 王五 20 二班 100 NaN
3 赵六 21 二班 99 NaN
data3 = pd.merge(data1,data2,on=['姓名'],how='left')
print(data3)
output
姓名 年龄_x 班级_x 语文成绩 年龄_y 班级_y 数学成绩
0 张三 18 一班 80 18.0 一班 80.0
1 张三 18 一班 80 19.0 二班 90.0
2 李四 19 一班 90 NaN NaN NaN
3 王五 20 二班 100 NaN NaN NaN
4 赵六 21 二班 99 NaN NaN NaN
# right,右表存在的都会成立
data3 = pd.merge(data1,data2,on=['姓名'],how='right')
print(data3)
output
姓名 年龄_x 班级_x 语文成绩 年龄_y 班级_y 数学成绩
0 张三 18.0 一班 80.0 18 一班 80
1 张三 18.0 一班 80.0 19 二班 90
2 王七 NaN NaN NaN 20 二班 100
3 赵七 NaN NaN NaN 21 二班 99
# outer,外连接
data3 = pd.merge(data1,data2,on=['姓名'],how='outer')
print(data3)
output
姓名 年龄_x 班级_x 语文成绩 年龄_y 班级_y 数学成绩
0 张三 18.0 一班 80.0 18.0 一班 80.0
1 张三 18.0 一班 80.0 19.0 二班 90.0
2 李四 19.0 一班 90.0 NaN NaN NaN
3 王五 20.0 二班 100.0 NaN NaN NaN
4 赵六 21.0 二班 99.0 NaN NaN NaN
5 王七 NaN NaN NaN 20.0 二班 100.0
6 赵七 NaN NaN NaN 21.0 二班 99.0
dic1={
"编号":[1,2,3],
"班级名称":['一班','二班','三班']
}
dic2={
"学号":[1,2,3,4],
"姓名":['张三','李四','王五','赵六'],
"班级":[1,1,2,3]
}
dic3={
"学号":[1,2,3],
"成绩":[80,90,100]
}
data1 = pd.DataFrame(dic1,index=dic1['编号'])
data2 = pd.DataFrame(dic2,index=dic2['学号'])
data3 = pd.DataFrame(dic3,index=dic3['学号'])
print(data1)
print(data2)
print(data3)
output
编号 班级名称
1 1 一班
2 2 二班
3 3 三班
学号 姓名 班级
1 1 张三 1
2 2 李四 1
3 3 王五 2
4 4 赵六 3
学号 成绩
1 1 80
2 2 90
3 3 100
# 如果两个表关联字段的名称不一致
data3 = pd.merge(data2,data1,left_on='班级',right_on='编号',how='left')
print(data3)
output
学号 姓名 班级 编号 班级名称
0 1 张三 1 1 一班
1 2 李四 1 1 一班
2 3 王五 2 2 二班
3 4 赵六 3 3 三班
# 设置索引后的关联
data3 = pd.merge(data2,data1,left_on='班级',right_index=True)
print(data3)
output
学号 姓名 班级 编号 班级名称
1 1 张三 1 1 一班
2 2 李四 1 1 一班
3 3 王五 2 2 二班
4 4 赵六 3 3 三班
# 多表关联
data4 = pd.merge(data2,data1
,left_on='班级'
,right_index=True
,how='left').merge(data3,on='学号',how='left')
print(data4)
output
学号 姓名_x 班级_x 编号_x 班级名称_x 姓名_y 班级_y 编号_y 班级名称_y
0 1 张三 1 1 一班 张三 1 1 一班
1 2 李四 1 1 一班 李四 1 1 一班
2 3 王五 2 2 二班 王五 2 2 二班
3 4 赵六 3 3 三班 赵六 3 3 三班
posted @   DogLeftover  阅读(265)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2021-11-14 异常处理和泛型
点击右上角即可分享
微信分享提示

目录导航