目录
1 pandas库
我们一般起别名为pd:
import pandas as pd
pandas 不仅可以从多种不同的文件格式读取数据,还有各种各样的数据处理的功能。
1.1 使用 pandas 读取 csv 文件
pandas 模块提供了一个 read_ csv
的方法,可以直接读取 csv 文件,并返回一个 DataFrame 对象。DataFrame 对象是 pandas 模块的核心,pandas 的所有表格都是通过 DataFrame 对象来存储的,并且 DataFrame 还提供了非常多查看数据、修改数据的方法。
注:为了让DataFrame对象打印起来更好看(在jupyter notebook里面),那就把 DataFrame 变量放在 Cell 的末尾,就会更加好看。
1.2 使用 pandas 读取 excel 文件
pandas 也提供了read_excel
函数来实现读取 excel 文件中的内容,但是使用方法比 read_ csv
稍微复杂一些。
但是excel可以有多个sheet,所以需要多个参数读取不同的表格:
# 使用 read_excel 函数读取 data.xlsx 文件里的 “sheet2” 这个表格
# 并将结果存在 df_perf 变量中
df_perf = pd.read_excel("data.xlsx", sheet_name="sheet2")
# 让notebook 打印 df_perf 变量
df_perf
如果不指定,pandas 则默认加载第一个表格。
>>选择性读取
有时候, excel 文件的数据很多,全部加载到 Python 中可能会卡,而且有时候我们只对其中某几列感兴趣,全部加载显示也不容易看。read_excel
提供了usecols
参数,可以指定要加载哪几列。
df_perf1 = pd.read_excel("info.xlsx", sheet_name="sheet2", usecols="A,B")
# 这里指的是加载Excel A、B两列
1.3 使用 pandas 读取 html 文件
通过 read_html
函数将 html 内容中的表格提取为一个DataFrame 的列表,通过逐一查看来确定哪个是我们想要的。
# 人民银行的2020金融市场报表数据
url= "http://www.pbc.gov.cn/eportal/fileDir/defaultCurSite/resource/cms/2021/01/2021011818262828764.htm"
from selenium import webdriver
brow = webdriver.Chrome()
brow.get(url)
eco_content = brow.page_source
# print(eco_content)
df_list = pd.read_html(eco_content)
print(len(df_list))
# 人民银行的2020金融市场报表数据在此
df_list[0]
1.4 DataFrame对象
1.4.1 关键概念
- index:索引
- Series:一种数据类型,Series 一般由两部分组成:index 和 values。其中values类似于列表,index 代表了索引(为了能方便地定位到 values 里面的数据)。此外,Series 有一个单独的索引项,这就使得它既支持类似列表一样的数字索引,也支持类似字典一样的用字符串或者其他 Python 对象来做索引。
(可以理解为列表和字典的集合体[{...},{...},...]
) - DataFrame:二维数据表,其实就是由 Series 组成的,DataFrame 的某一行,或者某一列都是一个 Series。
1.4.2 一维数据序列Series
创建一个序列
我们单独访问两个属性:
从代码输出结果可以看到,values 其实就是我们传入的列表值,而 index 则是一个 RangeIndex 的对象。然后我们就可以通过ser1[1]
的方式来索引到values的值。
接下来尝试创建 Series,并指定索引:
这里就可以看到同时创建了对应的索引,然后我们打印索引和值:
所以 Series 可以看成是高级的列表或者字典,当不指定 index 的时候,Series 会生成默认的位置索引,这样的 Series 就像是一个列表。而当我们指定了 index 之后,则可以通过 index 列表中的元素来访问对应的 values 中的元素,就像字典的 key-value 结构一样。
1.4.3 二维数据表:DataFrame
列 Series 的 index 是 DataFrame 的行头,
行 Series 的 index 则是 DataFrame 的列名。
(1)用Series 构造出 DataFrame
来构造这个表格:
index = ['库名', '熟练度', '使用难度']
ser_pd = pd.Series(['pandas', 65, '中'], index=index)
ser_np = pd.Series(['numpy', 75, '易'], index=index)
ser_plt = pd.Series(['matplotlib', 70, '易'], index=index)
df = pd.DataFrame([ser_pd, ser_np, ser_plt])
df
我们除了可以用Series,还可以用列表、字典、numpy的ndarray对象等来创建DataFrame对象,可以参考《菜鸟教程:Pandas 数据结构 - DataFrame》。
(2)添加行、列
利用append
方法就可以添加行到DataFrame对象:
# 我们添加一行数据
ser_torch = pd.Series(['pytorch', 55, '难'], index=index)
# 设置 ignore_index 的含义是让 DataFrame 自动生成行索引
# 调用 append 之后,会返回一个新的 DataFrame,我们将其保存回原变量中
df = df.append(ser_torch, ignore_index= True)
# 查看添加后的DataFrame
df
添加列的方式更简单一些:
# 将新添加的 Series 赋值给 DataFrame 中新列名对应的列 Series
df["考核结果"] = pd.Series(["合格", "优秀", "合格", "不合格"])
# 打印
df
# 当然还可以统一添加一个值
df["考核结果"] = "合格"
# 打印
df
当我们对 DataFrame 某个列名对应的列 Series 赋值,当列名不存在的时候,则会新建对应的列,而当列名存在时,则会修改原先列的值。所以我们不仅可以创建新的列也可以修改已有的列。
(3)删除行、列
DataFrame 提供了 drop 方法来删除某一行或者某一列。
删除列:
# labels 是要删除的列名
# axis = 1 代表要删除的是列
# inplace = True 代表删除直接在 df中生效。
df.drop(labels = "考核结果", axis=1, inplace= True)
# 打印
df
删除行:
# labels 是要删除的行的index
# axis = 0 代表要删除的是行
# inplace = True 代表删除直接在 df中生效。
# 我们删除库名为matplotlib的信息
df.drop(labels = 2, axis=0, inplace=True)
# 打印
df
(4)单个单元格的查看与修改
对于单个单元格的查看和修改,推荐的方式是使用 DataFrame 的 loc 属性,可以一步到位指定定位到单元格,假设我们需要查看第三方库pytorch的熟练度:
# loc 属性后面跟中括号,中括号里面第一个元素是行索引,第二个元素是列索引
# pytorch的行索引是1,我们想查看熟练度,所以列索引就是熟练度
df.loc[3, "熟练度"]
然后我们直接赋值就可以修改熟练度:
df.loc[3, "熟练度"] = 65
(5)DataFrame 的排序
DataFrame 提供了 sort_values 方法来实现排序,例如我们想要根据熟练度对第三方库进行排序:
# by 参数代表要按 rating 这个列索引来排序
# inplace = True 的含义和上面一样,代表更新当前的DataFrame,而不是返回一个新的
df.sort_values(by = "熟练度", inplace=True)
# 查看排序后的 DataFrame
df
默认是升序排序,降序排序需要设置ascending 设置为False:
# by 参数代表要按 rating 这个列索引来排序
# inplace = True 的含义和上面一样,代表更新当前的DataFrame,而不是返回一个新的
df.sort_values(by = "熟练度", inplace=True, ascending=False)
# 查看排序后的 DataFrame
df
从这里可以发现,之前我们删掉了一行,导致行2缺失,但是不应影响序列,所以Series 的数字索引是可以不连续的,这个也是和列表的一个重要区别。
(6)取头取尾与计算行列数
简单操作,不需要演示,针对于较多数据十分管用。
# head 函数返回 DataFrame 的前 N 条记录,N就是函数参数指定的值
# 这里我们指定10行
df.head(10)
# tail 函数,返回DataFrame 的末尾的 N 条记录,N就是函数的参数
# 这里我们指定10行
df.tail(20)
# shape 属性,返回一个元组,第一个是行数,第二个元素是列数
shape = df.shape
# 打印行数和列数
print("行数:", shape[0])
print("列数:", shape[1])
1.5 切片与数据查询loc 和 iloc
1.5.1 切片
中括号[], 是 pandas 中最基础的索引器,和python中的切片类似。
DataFrame 和 Series 同样支持 []. 具体的行为是:
1.对 Series 使用[],返回索引对应的元素;
2.对 DataFrame 使用[],返回列名等于索引的那一列,以 Series 的形式。
# 获取库名Series
ser_name = df["库名"]
print(type(ser_name))
print(ser_name)
print("----------------------")
# 我们还可以选择多条数据数据,返回还是Series
ser_name_1 = ser_name[[0,2]]
print(type(ser_name_1))
print(ser_name_1)
# 获取新的DataFrame
df_new = df[["库名", "使用难度"]]
print(type(df_new))
print(df_new)
== 切片的运用==
这里和python的切片类似就不细说了,关于python基本数据类型详见撰写的《Python四种重要数据结构的深入学习》。
1.5.2 数据查询loc和iloc
用切片查找元素十分笨拙,所以pandas 除了 [] 索引器之外,还提供了一套非常强大的数据查询方式:loc 和 iloc。
pandas提供了专门的用于索引DataFrame的方法,即使用ix方法进行索引,不过ix在最新的版本中已经被废弃了,如果要是用标签,最好使用loc方法,如果使用下标,最好使用iloc方法。
(1)loc
# 基本形式
df.loc[行索引名称, 列索引名称]
loc 对象的 [] 索引器支持所有 DataFrame 的 [] 索引器的能力,即 loc 对象的行索引部分和列索引部分都可以分别使用多种索引、范围选择的语法。
(2)iloc
iloc 的用法和 loc 非常类似,区别是 iloc 仅支持传入整数索引。
loc 是需要传入行索引和列索引的名称,而 iloc 则需要传入第几行、第几列这样的数字。基本用法如下:
df.iloc[第几行, 第几列]
(3)条件查询
df.loc[条件表达式, 列索引名称]
使用示例:
1.6 数据清洗
1.6.1 缺失值处理
当我们从 CSV 文件或者其他数据源加载到 DataFrame 中时,往往会遇到某些单元格的数据是缺失的。当我们打印出 DataFrame 时,缺失的部分会显示为 NaN, 或者 None,或者 NaT(取决于单元格的数据类型),这样的值我们就称之为缺失值。
我们创建一个带有数据缺失的表格: