数据大清洗_Pandas库

一、 对 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))


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值