目录
一、 对 Pandas 库认识
pandas(panel data & data analysis),是基于 numpy(提供高性能的矩阵运算)专 门用于数据分析的工具,是一个强大的分析结构化数据(表格数据)的工具集;能够用于数 据挖掘和数据分析,同时也提供数据清洗功能。
1.1 利器之一:DataFrame
DataFrame 是 Pandas 中的一个表格型的数据结构,包含有一组有序的列,每列可以是
不同的值类型(数值、字符串、布尔型等)。
观察表格可以发现:表格有三部分组成,
表头(列索引)、行名称(行索引) 、数据元素部分。
创建 DataFrame 的三种形式
方式 1:逐个传入行索引、列索引和 数据元素
import pandas as pd
import numpy as np
# 用来存储数据 ---两种结构
# DataFrame ---具有行索引、具有列索引 、数据---的表格数据
# ---可以存储不同的数据类型
# # 创建df --列表嵌套
# data = [['zs', 19, 1],
# ['ls', 18, 2],
# ['ww', 20, 1],
# ['zl', 19, 2]]
# print('data:\n', data)
# print('data的类型:\n', type(data))
#
# # 将data 转化df
# df = pd.DataFrame(data=data, # 数据,
# index=['stu0', 'stu1', 'stu2', 'stu3'], # 行名称、行索引
# columns=['name', 'age', 'group'], # 列索引、列名称
# )
#
# print('df:\n', df)
# print('df的类型:\n', type(df)) # <class 'pandas.core.frame.DataFrame'>
# 创建df ---使用大字典
# df = pd.DataFrame(
# data={
# 'name': ['zs', 'ls', 'ww', 'zl'],
# 'age': [19, 18, 20, 19],
# 'group': [1, 2, 1, 2]
# },
# index=['stu0', 'stu1', 'stu2', 'stu3'] # 行索引
# )
# print('df:\n', df)
# print('df的类型:\n', type(df))
# 将ndarray数组转化为df
# 先加载ndarray
# res = np.load('./国民经济核算季度数据.npz')
# # 获取数组
# columns = res['columns']
# values = res['values']
# print('columns:\n', columns)
# print('values:\n', values)
# # 构建行索引名称
# index = ['index_' + str(tmp) for tmp in range(values.shape[0])]
# # 将columns 与 values 结合起来
# df = pd.DataFrame(data=values,
# columns=columns,
# index=index)
# print('df:\n',df)
# print('df的类型:\n',type(df))
1.2 利器之二:Series
它是一种类似于一维数组的对象,是由一组数据(各种 NumPy 数据类型)以及一组与之相
关的数据标签(即索引)组成。仅由一组数据也可产生简单的 Series 对象。Series 对象没有列索引
创建 Series。
可以由简单列表、一维数组转化而来。
import pandas as pd
import numpy as np
# Series ----只有行索引、数据的表格结构
# ----数据的类型都是一致
# # 创建series --由简单列表、一维数组转化为series
# # se = pd.Series(data=['zs', 'ls', 'ww', 'zl'], # 数据
# se = pd.
# (data=np.array(['zs', 'ls', 'ww', 'zl']), # 数据
# index=['stu0', 'stu1', 'stu2', 'stu3']) # 行索引
# print('se:\n', se)
# print('se的类型:\n', type(se)) # <class 'pandas.core.series.Series'>
# 创建series --通过映射关系来创建series,并按照index进行排序
# 基础班 ---字典是无序(仅限于Python3.7版本之前)
scores = {'zs': 90, 'ls': 80, 'ww': 60, 'zl': 48}
index = ['zs', 'zl', 'ww', 'ls', 'kk']
se = pd.Series(data=scores,
index=index # 行名称,指定排序规则
)
print('se:\n', se)
print('se的类型:\n', type(se))
# 从df中获取一列数据 ---series ---特殊的df(一列的且无列名称的特殊的df)
# se = df['name']
# print('se:\n', se)
# print('se的类型:\n', type(se))
1.3 Series 和 DataFrame 的关系
获取 dataframe 中的一列数据,得到的数据类型为 Series。DataFrame 可以被看做是由Series 组成的字典。
DataFrame 属性及 Series 属性
以学生信息表为例:
import pandas as pd
# 创建一个dataframe
df = pd.DataFrame(
data={
'name': ['zs', 'ls', 'ww', 'zl'],
'age': [18, 19, 20, 18],
'group': [1, 2, 2, 1]
},
index=['stu0', 'stu1', 'stu2', 'stu3']
)
print('df:\n', df)
print('df的类型:\n', type(df))
print('*' * 100)
"""
dataframe属性
values index columns dtypes size ndim shape
df中的数据元素
可以将df 通过df.values转化为ndarray
pd.DataFrame将ndarray转化为df
"""
print('df的values:\n', df.values)
print('df的values的类型:\n', type(df.values)) # <class 'numpy.ndarray'>
# #
print('df的index :\n', df.index) # 行索引
print('df的columns:\n', df.columns) # 列索引
#
# # df可以存储不同类型的数据
# print('df的dtypes:\n', df.dtypes) # df中每一列的数据类型
# df的dtypes:
# age int64
# group int64
# name object
# dtype: object
print('df的size:\n', df.size) # 元素个数
print('df的ndim:\n', df.ndim) # 维数---->2维
print('df的shape:\n', df.shape) # 形状 (行,列)
# series属性
se = df['age']
print('se:\n', se)
print('se的类型:\n', type(se))
print('*' * 100)
# 相比于dataframe --->没有columns属性
# values index dtypes/dtype ndim shape size itemsize
# se中的数据元素
# pd.Series可以将一维数组转化series
# 也可以通过se.values将Series转化为ndarray
print('se的values:\n', se.values)
print('se的values的类型:\n', type(se.values)) # <class 'numpy.ndarray'>
print('se的index:\n', se.index) # 行索引
print('se的dtypes:\n', se.dtypes) # 元素类型
print('se的dtype:\n', se.dtype) # 元素类型
print('se的ndim:\n', se.ndim) # 维度--->1维
print('se的shape:\n', se.shape) # 形状 # (4,) --->只有一个维度--->行维度
print('se的size:\n', se.size) # 元素个数
print('se的itemsize:\n', se.itemsize) # 每一个元素的占位大小
二、Pandas 读写文件
通常表数据会存储在文本文件(.txt/.csv 类型) 、excel 文件中。
需要分析文件中数据时, 利用 Pandas 读取这些文件后会存保存为 DataFrame 数据。此外还可以将处理分析完成的 DataFrame 数据写入文件进行保存。
文本文件读取
文本文件是一种由若干行字符构成的计算机文件,它是一种典型的顺序文件。
csv 是一种特殊的文本文件,默认逗号为分隔符,但其分隔符不一定是逗号,又被称为
字符分隔文件,文件以纯文本形式存储表格数据(数字和文本)。
1、使用 read_table 来读取文本文件
pandas.read_table(filepath_or_buffer,sep=’\t’,header=’infer’,names=None,
index_col=None,dtype=None,engine=None,nrows=None)
2、使用 read_csv 函数来读取 csv 文件
pandas.read_csv(filepath_or_buffer,sep=’\t’,header=’infer’,names=None,i
ndex_col=None,dtype=None,engine=None,nrows=None)
案例:(读取莫公司菜单信息)
文本文件保存
文本文件的存储和读取类似,结构化数据可以通过 pandas 中的 to_csv 函数实现以 csv
文件格式存储文件。
DataFrame.to_csv(path_or_buf=None, sep=’,’, na_rep=”, columns=None,
header=True, index=True,index_label=None,mode=’w’,encoding=None)
Excel 文件读取
pandas 提供了 read_excel 函数来读取“xls”、“xlsx”两种 Excel 文件。
pandas.read_excel(io, sheetname=0, header=0, index_col=None, names=None,
dtype=None)
Excel 文件保存
将文件存储为 Excel 文件,可以使用 to_excel 方法。
DataFrame.to_excel(self,excel_writer,sheet_name=‘Sheet1’,na_rep=’’,float_format=None,columns=None,header=True,index=True,index_label=None,startrow=0,startcol=0,engine=None,merge_cells=True,encoding=None,inf_rep=‘inf’,verbose=True,freeze_panes=None):
注意:
与 to_csv 方法的常用参数基本一致,区别之处在于指定存储文件的文件路径参数名称
为 excel_writer,并且没有 sep 参数,增加了一个 sheetnames 参数用来指定存储的 Excel
sheet 的名称,默认为 sheet1。
import pandas as pd
# 常用的文件excel文件、csv文件、html文件、json文件....
# 1、pandas读取文件
# pandas里面读取文件格式:pd.read_xxx格式
# pd.read_csv()
# pd.read_table()
# csv文件 ---特殊的以逗号分隔的、文本的序列文件
# 读取csv文件
# info = pd.read_csv(filepath_or_buffer='./meal_order_info.csv', # 文件路径+名称
# encoding='ansi', # 编码方式
# # delimiter=',', # 分隔符
# # sep=',' # 分隔符
# # header='infer', # 读取的文件的时候,列索引自动识别,也可以显式指定
# # header=0, # 显式指定第n行为 列索引
# # names=['列1', '列2'], # 可以自定义列索引名称
# # usecols=[0, 1] # 可以指定读取的列下标
# # index_col=0, # 指定特定的列作为行索引名称
# # nrows=10, # 可以指定读取前n行
# )
# # 参数参考read_csv理解,和read_csv的区别在于:没有默认的分隔符
# # info = pd.read_table('./meal_order_info.csv', sep=',', encoding='ansi')
# #
# print('info:\n', info)
# print('info 的类型:\n', type(info)) # <class 'pandas.core.frame.DataFrame'>
# # excel文件 ---以.xlsx .xls为结尾的表格数据文件
# detail = pd.read_excel(io='./meal_order_detail.xlsx', # 文件路径 + 名称
# sheetname=None, # 读取表格下标
# # header=0, # 以表格的第0行为列索引
# # # index_col=0 ,# 可以指定特定列为行索引
# # parse_cols=[0, 1], # 读取指定的列
# )
# print('detail:\n', detail) # --->OrderedDict
#
# # 可以通过
# print(detail.keys()) # odict_keys(['meal_order_detail1', 'meal_order_detail2', 'meal_order_detail3'])
# print('*' * 100)
# 获取不同的sheet
# detail_1 = detail['meal_order_detail1']
# detail_2 = detail['meal_order_detail2']
# detail_3 = detail['meal_order_detail3']
# print('detail_1:\n', detail_1)
# 2、pandas保存文件
# pandas保存文件的格式:df.to_xxx格式
# csv文件保存
# info.to_csv(path_or_buf='./aaa.csv', # 保存的路径+名称
# sep=',', # 分隔符
# header=True, # 需要保存列索引,如果不需要保存列索引--->header=False
# index=True, # 需要保存行索引,如果不需要保存行索引---->index=False
# # columns=['info_id','emp_id'] # 指定需要保存的列
# mode='a', # 没保存一次,之前的内容都会被覆盖掉,如果想要追加保存--->mode='a'
# )
# excel文件保存
# 一次只能保存一个sheet
# detail_1.to_excel(excel_writer='./bbb.xlsx', # 具体的路径+ 名称 或者ExcelWriter对象
# sheet_name='Sheet1', # 默认保存的表格的名称
# header=True, # 保存列索引,如果不保存--header=False
# index=True, # 保存行索引,如果不保存,---index=False
# # startrow=20, # 保存的文件里面跳过指定行继续保存
# # startcol=5, # 保存的文件里面跳过指定列继续保存
# )
#
# detail_2.to_excel(excel_writer='./bbb.xlsx', # 具体的路径+ 名称 或者ExcelWriter对象
# sheet_name='Sheet2', # 默认保存的表格的名称
# header=True, # 保存列索引,如果不保存--header=False
# index=True, # 保存行索引,如果不保存,---index=False
# # startrow=20, # 保存的文件里面跳过指定行继续保存
# # startcol=5, # 保存的文件里面跳过指定列继续保存
# )
# 若果按照上面的方式进行保存---->每保存一次,覆盖一次
# 将多个df分别保存到相同文件的不同sheet中去
# 可以借助 ExcelWriter 来进行保存
# 创建ExcelWriter对象
# writer = pd.ExcelWriter('./ccc.xlsx')
# # 将不同df 保存到不同sheet中
# # 写入数据
# detail_1.to_excel(excel_writer=writer, sheet_name='sheet1')
# detail_2.to_excel(excel_writer=writer, sheet_name='sheet2')
# detail_3.to_excel(excel_writer=writer, sheet_name='sheet3')
# # 保存修改
# writer.save()
# # 关闭ExcelWriter对象
# writer.close()
三、DataFrame 的查询操作
对单列数据的访问:DataFrame 的单列数据为一个 Series。根据 DataFrame 的定义可以
知晓 DataFrame 是一个带有标签的二维数组,每个标签相当每一列的列名。有以下两种方式
来实现对单列数据的访问。
(1)以字典访问某一个 key 的值的方式使用对应的列名,实现单列数据的访问。
(2)以属性的方式访问,实现单列数据的访问。 (不建议使用,易引起混淆)
以 菜品 订 单为 例 , 使用 字 典访 问 内部 数 据的 方 式 访问 DataFrame 的 单列 数
(dishes_name 列)的数据。
import pandas as pd
# 加载detail数据
# 默认加载第0个sheet
detail = pd.read_excel('./meal_order_detail.xlsx')
# 修改一下行索引
index = ['index_' + str(tmp) for tmp in detail.index]
detail.index = index
print('detail:\n', detail)
print('detail的列索引:\n', detail.columns)
print('*' * 100)
# df索引方式--->先列后行(直接索引方式)
# ndarray索引---arr[行,列] ---同时索引
# 获取 dishes_name 这一列数据 --列名 --Series
# print('获取单列数据:\n', detail['dishes_name'])
# 获取 dishes_name dishes_id amounts counts 这四列数据 --列名列表 --dataframe
# print('获取多列数据:\n', detail[['dishes_name', 'dishes_id', 'amounts', 'counts']])
# 获取单列数据指定行---->行下标列表、行名称列表、行下标切片、行名称切片
# ---->head(获取前n行)
# ---->tail(获取后n行)
# 获取 dishes_name 这一列 数据 的前n行 ---行下标切片
print('获取单列数据:\n', detail['dishes_name'][:5])
# # 获取 dishes_name 这一列 数据 的前n行 ---行名称切片 ---包含结束位置
# print('获取单列数据:\n', detail['dishes_name'][:'index_4'])
#
# # 获取 dishes_name 这一列 数据 的前n行 ---行下标列表
# print('获取单列数据:\n', detail['dishes_name'][[0, 1, 2, 3, 4]])
# 获取 dishes_name 这一列 数据 的前n行 ---行名称列表
# print('获取单列数据:\n', detail['dishes_name'][['index_0', 'index_1', 'index_2', 'index_3', 'index_4']])
# # 获取 dishes_name 这一列 数据 的前n行 ---head()
# print('获取单列数据:\n', detail['dishes_name'].head(10))
# 获取 dishes_name 这一列 数据 的后n行 ---tail()
# print('获取单列数据:\n', detail['dishes_name'].tail(10))
# 获取多列数据的前n行---->行下标切片、行名称切片
# ---->head(获取前n行)
# ---->tail(获取后n行)
# 获取 dishes_name dishes_id amounts counts 这四列数据 --列名列表 --dataframe --->前n行数据 --不能使用行下标列表
# print('获取多列数据:\n', detail[['dishes_name', 'dishes_id', 'amounts', 'counts']][[0, 1, 2, 3, 4, 5]]) # 此时是错误的,不能使用行下标列表
# 获取 dishes_name dishes_id amounts counts 这四列数据 --列名列表 --dataframe --->前n行数据 --不能使用行名称列表
# print('获取多列数据:\n',
# detail[['dishes_name', 'dishes_id', 'amounts', 'counts']][['index_0', 'index_1', 'index_2']]) # 此时是错误的,不能使用行名称列表
# 获取 dishes_name dishes_id amounts counts 这四列数据 --列名列表 --dataframe --->前n行数据 --行下标切片 --可行
# print('获取多列数据:\n',detail[['dishes_name', 'dishes_id', 'amounts', 'counts']][0:5])
# 获取 dishes_name dishes_id amounts counts 这四列数据 --列名列表 --dataframe --->前n行数据 --行名称切片 --可行
# print('获取多列数据:\n',detail[['dishes_name', 'dishes_id', 'amounts', 'counts']]['index_0':'index_5'])
# # 获取 dishes_name dishes_id amounts counts 这四列数据 --列名列表 --dataframe --->前n行数据 --head --可行
# print('获取多列数据:\n', detail[['dishes_name', 'dishes_id', 'amounts', 'counts']].head(10))
#
# # 获取 dishes_name dishes_id amounts counts 这四列数据 --列名列表 --dataframe --->后n行数据 --tail--可行
# print('获取多列数据:\n', detail[['dishes_name', 'dishes_id', 'amounts', 'counts']].tail(10))