展开
拓展 关闭
订阅号推广码
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 @ 2023-11-14 15:08  DogLeftover  阅读(134)  评论(0编辑  收藏  举报