pandas库基础知识
一、jupyter 代码编辑器
Cell [sel] 细胞
jupyter 代码编辑器的一个代码单元,一般叫它 Cell。
Cell 是这款 jupyter 代码编辑器的主要构成要素。
代码的输入以及代码结果的输出都是在 Cell 中实现的。
Cell 一共由两个部分组成:In[] 和 Out[],即输入框和输出框。
Cell 在使用时有两个很重要的特点,第一点体现在查看变量的时候,第二点体现在变量值的传递上。查看变量值的时候,只要输入变量名就可以了。
jupyter 代码编辑器第二个特点:当前的 Cell 可以沿用之前 Cell 的运算结果,也就是变量的值是可以传递的。
下面讲解的pandas库知识点中的代码运行示例均是在 jupyter 代码编辑器环境下的示例
概述:Python 数据分析库介绍
二、pandas 库基础知识
pandas [ˈpændəz] 熊猫
pandas 库是一个专门用来解决数据分析问题的库。
pandas 库有以下两大优势:
1)速度快:快速处理大型数据集;
2)效率高:提供大量高效处理数据的函数和方法。
import pandas as pd #导入 pandas 库 简化为 pd
pandas 库提供了两种数据结构:Series 和 DataFrame,来提升操作速度和效率。
(1)常用的Series属性与方法:
s.index #查看索引
s.values #查看数值
s.isnull() #查看为空的,返回布尔型
s.sort_index() #按索引排序
s.sort_values() #按数值排序
(2) DataFrame常用方法
df.head( 5 ) #查看前5行
df.tail( 3 ) #查看后3行
df.values #查看数值
df.index #查看索引
df.shape #查看行数、列数
df.fillna(0) #将空值填充0
df.replace(1, -1) #将1替换成-1
df.isnull() #查找df中出现的空值
df.dropna() #删除空值
df.unique() #查看唯一值
df.reset_index() #修改、删除,原有索引
df.columns #查看df的列名
df.sort_values() #排序
1、Series对象
Series [ˈsɪəriːz] 系列
Series 主要由一组数据及其对应的索引组成。
在上面的例子中,我们还可以在数据的底部看到这样一行信息:dtype: object。
其中,dtype 指的是 pandas 库中的数据类型,object 就等价于之前 python 学过的字符串类型。
dtype 为 object 指的就是,Series 对象中的数据,至少有一条是字符串类型的。
pd.Series() 就是创建 Series 对象的方法。
2.1.1、 借助列表来创建 Series 对象的方法,也就是:pd.Series(data)
#创建Series对象
surname = pd.Series(['赵', '钱', '孙', '李'])
#查看surname
surname
0 赵
1 钱
2 孙
3 李
dtype: object
在这个案例中,是将一个列表:[‘赵’, ‘钱’, ‘孙’, ‘李’],传给了参数 surname。
当我们将列表传给参数 data 之后,在默认情况下,pd.Series(data) 会自动为列表中的每一个元素分配对应的数字索引。
默认索引是从 0 开始,以 0, 1, 2, 3,… 的形式按序分配给列表中的元素。
Series 对象应用示例,把temp_list1 = [1, 2, 3, 4]
temp_list2 = [5, 6, 2, 3] 2个列表中的元素一一对应相加
1、 用之前学过的列表、循环等知识来解决这个问题
# 创建两个原始列表
temp_list1 = [1, 2, 3, 4]
temp_list2 = [5, 6, 2, 3]
# 创建新列表 temp_list_new
temp_list_new = []
# 将两个原始列表的元素之和添加进 temp_list_new
for i in range(len(temp_list1)):
temp_list_new.append(temp_list1[i] + temp_list2[i])
# 查看新列表 temp_list_new
temp_list_new 返回:[6, 8, 5, 7]
2、用 Series 对象中的方法来求这个新列表。
# 创建两个原始列表
temp_list1 = [1, 2, 3, 4]
temp_list2 = [5, 6, 2, 3]
# 创建新的 Series 对象
temp_s = pd.Series(temp_list1) + pd.Series(temp_list2)
# 查看 temp_s
temp_s
终端:
0 6
1 8
2 5
3 7
dtype: int64
2、 DataFrame对象
Data– [ˈdeɪtə] – 数据 , frame – [freɪm]–框架
2.1、借助字典来创建 DataFrame 对象的方法,也就是:pd.DataFrame(data)
DataFrame对象是一种表格型的数据结构,包含行索引、列索引以及一组数据。
图示:
创建 DataFrame 对象的方法是:pd.DataFrame()
DataFrame 对象的参数可以是字典,示例:
# 创建 DataFrame 对象
new_df = pd.DataFrame({'年龄': [23, 22, 21],
'岗位': ['客服', '运营', '公关'],
'年购买量': [10, 15, 8]})
# 查看 new_df
new_df
当我们给参数 传入字典的时候,字典的键会变成 DataFrame 对象的列索引,字典的键所对应的值会变成 DataFrame 对象的数据,行索引则默认是 0, 1, 2,…
字典中的键所对应的值的长度必须是一样的
上图中,new_df 中,年龄、岗位以及年购买量这三个键所对应的值长度都为 3,各键所对的值的长度如果不相等,就意味着数据是长短不一的,这样的字典如果传给了参数data,则会报错。字典的各键值长度一定要相等。
2.2 通过传入 n 维数组的方式来创建DataFrame 对象的方法
columns-- [ˈkɒləmz] --柱
# 创建DataFrame对象
import numpy as np
class_df2 = pd.DataFrame(np.array([[25, '女'],
[18, '女'],
[23, '女'],
[18, '男']]),
columns = ['年龄', '性别'],
index = [1, 2, 3, 4])
# 查看 class_df2
class_df2
#终端:
年龄 性别
1 25 女
2 18 女
3 23 女
4 18 男
2.3、通过列表的形式创建DataFrame 对象
以嵌套列表作为数据传入时,列表的元素会作为 DataFrame 对象的行数据显示,且会为数据默认生成从 0 开始的列名,也可以借助 DataFrame() 类的参数 columns 来设置列名。例:
In [ 8 ]
1 # 设置列表
2 students_info = [['小蓝', '语文', '79'],
3
['小邱', '数学', '83'],
4
['小李', '英语', '92']]
5
6
# 使用列表创建 DataFrame 对象,同时设置列名。
7 students_df = pd.DataFrame(students_info, columns=['姓名', '科目', '分数'])
8 students_df
对于已创建好的 DataFrame 对象,也可以修改列名,如:
students_df.columns = [ ‘分数’,‘姓名’, ‘科目’]
,
3、Series 对象和 DataFrame 对象的联系
DataFrame 对象可以被看作是由 Series 对象所组成的。
# 提取'年龄'这一列数据
class_df['年龄']
----------------------
0 25
1 18
2 23
3 18
Name: 年龄, dtype: int64
#通过 DataFrame['列索引'] 这个方法提取出来的数据,是一个 Series 对象!
# 查看'年龄'这一列数据的类型
type(class_df['年龄'])
---------------------
终端:
pandas.core.series.Series
果然,提取出来的年龄这一列数据是一个 Series 对象!
同理,提取其它列的数据也会返回 Series 对象。
思维导图
三、用pandas库读、写文件:
3.1用pandas库读取和写入 Excel 文件
3.1.1、read_excel() 函数读取 Excel 数据
read_excel() 函数,它可以以 DataFrame 格式读取 Excel 文件的数据,并返回一个 DataFrame 对象
1)参数 io 传入的是 Excel 文件路径或文件对象。例如 ‘test.xlsx’;
2)参数 sheet_name 传入的是 Excel 文件的工作表名称,默认为第一个工作表 ‘Sheet1’。
例:
import pandas as pd
# 打开【成绩单.xlsx】工作簿,并获取【1 班】工作表的数据
data_1 = pd.read_excel('./工作/成绩单.xlsx', sheet_name='1 班')
data_1
3.1.2、to_excel() 函数将数据写入到 Excel 文件
to_excel() 函数可以以 DataFrame 格式将数据写入到 Excel 文件。
1)参数 excel_writer 同样传入的是 Excel 文件路径或文件对象;
2)参数 sheet_name 有些不同,传入的是新建 Excel 文件的工作表名称,默认为新建工作表 ‘Sheet1’;
3)参数 index 用于决定是否在写入时加上数据的行索引,默认为 True,即往文件中写入行索引。设置为 False 则不写入行索引。
代码示例:
如果想要创建一个工作表名为【2 班】的工作簿【新成绩单.xlsx】,并将创建的 DataFrame 数据写入到该工作表
1 # 创建一个 DataFrame 对象的数据
2 data_2 = pd.DataFrame({'学号':[1, 2, 3], '性别':['男', '男', '女'], '年龄':['17', '17', '16'], '总分':['285', '273', '240']})
3 # 将数据写入到【新成绩单.xlsx】工作簿中的【2 班】工作表
4 data_2.to_excel('新成绩单.xlsx', sheet_name='2 班', index=False)
上方代码中,将 to_excel() 函数的参数 index 设置为 False,目的是不把行索引也写入到工作簿中。因为 Excel 表中默认有行索引。如果数据的行索引在工作簿中不具备参考价值,建议不写入到工作簿中。
3.2用pandas库读写csv文件
pandas 库为读取各种文件类型的数据提供了非常简便高效的方法。
pd.read_csv(path, encoding) 就是其中一种高效读取 csv 文件的方法,返回的是一个 DataFrame 对象。
这个方法有很多参数,这里先介绍两种最常用的:path,encoding
对于参数 path,需要传一个文件路径给它。可以是相对路径,也可以是绝对路径。
对于参数 encoding,需要传一个文件编码格式给它。文件编码格式的选取需要根据所读文件的编码格式来定。
代码示例–导入或读取文件:
# 导入 csv 数据
my_data = pd.read_csv('./工作/mask_data.csv', encoding = 'utf-8')
查看数据—-只需要输入变量名就可以查看变量的值了:
# 查看 my_data
my_data
查相结果示例:
从底部的数据中可以发现,总行数是 101942,总列数是 6
写入函数为:to_csv() 方法与to_excel() 类似
四、数据的类型转换 astype()
type---[taɪp]---类型;种类
假如有一个 DataFrame 对象的数据是这样的:
英语分数为字符串类型
In [ 9 ]
1 # 创建一个 DataFrame 对象的数据
2 data_5 = pd.DataFrame({'姓名':['林某某', '许放羊', '王鱼'], '语文': [87, 82, 67], '数学':[73, 85, 90], '英语':['89', '95', '95']})
3 data_5
运行
Out [ 9 ]
姓名 语文 数学 英语
0 林某某 87 73 89
1 许放羊 82 85 95
2 王鱼 67 90 95
如果想要新建一个【总分】列,用来存储每个人三门科目的总分。
data_5[‘总分’] = data_5[‘语文’] + data_5[‘数学’] + data_5[‘英语’]
运行后程序会报错,因为【英语】列的数据为字符串类型,与其它两列的数据类型不一致。这就要求我们调整【英语】列的数据类型,使得三列的数据类型都为整数或者浮点型,才能进行求和操作。
astype() 方法中的参数 dtype, 我们可以为其赋上需要的数据类型,如 int、str 等。
由于参数 dtype 是 astype() 方法的第一个位置参数,所以我们在使用时无需写为 astype(dtype=int),可以直接写为 astype(int)。
已知【英语】列的数据类型为字符串类型,其它两列的数据类型为整数型。那只需要将【英语】列的数据类型转换为整数型。
代码示例:
In [ 11 ]
1 # 计算每个人三门科目的总分
2 data_5['总分'] = data_5['语文'] + data_5['数学'] + data_5['英语'].astype(int)
3 data_5
运行
Out [ 11 ]
姓名 语文 数学 英语 总分
0 林某某 87 73 89 249
1 许放羊 82 85 95 262
2 王鱼 67 90 95 252
五、数据的批量替换 replace()
replace--- [rɪˈpleɪs] ---代替
有时我们读取数据时,会发现数据里存在一些错误信息。如下图中的“山头市”:
为了确保数据的准确性,我们需要对这些错别字进行批量修改,替换为正确的内容。
例:
In [ 15 ]
1 # 创建一个 DataFrame 对象的数据
2 data_7 = pd.DataFrame({'性别':['难', '女', '难', '女', '女'],
3
'城市':['.', '潮州市', '山头市', '汕尾市', '山头市'],
4
'年龄':[25, 26, 24, 25, 26],
5
'爱好':['蓝球', '跑步', '跳舞', '逛街', '读书']})
6 data_7
运行
Out [ 15 ]
性别 城市 年龄 爱好
0 难 . 25 蓝球
1 女 潮州市 26 跑步
2 难 山头市 24 跳舞
3 女 汕尾市 25 逛街
4 女 山头市 26 读书
将上方数据中【城市】列的值“山头市”,以及【爱好】列的值“蓝球”,分别替换为“汕头市”、“篮球”。
先设置一个字典 fix_typo = {‘山头市’:‘汕头市’, ‘蓝球’:‘篮球’},再将该字典放入 replace() 方法里,具体实现代码如下:
In [ 62 ]
1 # 定义字典 fix_typo
2 fix_typo = {'山头市':'汕头市', '蓝球':'篮球'}
3 # 对【城市】、【爱好】列的错字进行修改
4 data_7 = data_7.replace(fix_typo)
5 data_7
运行
Out [ 62 ]
性别 城市 年龄 爱好
0 男 未知 25 篮球
1 女 潮州市 26 跑步
2 男 汕头市 24 跳舞
3 女 汕尾市 25 逛街
4 女 汕头市 26 读书
上方的代码会根据 replace() 内的参数内容,对整个 DataFrame 对象的数据进行批量替换。
如果只想对指定某一列的数据进行替换,比如只替换【城市】列的数据,代码如下:
In [ 18 ]
1 # 定义字典 fix_typo
2 fix_typo = {'山头市':'汕头市', '蓝球':'篮球'}
3 # 对【城市】列的错字进行修改
4 data_7['城市'] = data_7['城市'].replace(fix_typo)
5 data_7
运行
Out [ 18 ]
性别 城市 年龄 爱好
0 难 . 25 蓝球
1 女 潮州市 26 跑步
2 难 汕头市 24 跳舞
3 女 汕尾市 25 逛街
4 女 汕头市 26 读书
从运行结果可以看到,【爱好】列的“蓝球”没有被修改为“篮球”,原因是我们只指定【城市】列,所以其它列的数据不会被替换。
小结: