文章目录
前言
善始者繁多,克终者盖寡。
数据分析大抵包括数据收集、数据预处理、数据分析、数据可视化四个环节,数据预处理又是收集数据中的第一个步骤,干的事情主要就是过滤掉不需要的、不符合要求的、格式有问题的数据。
本人本科时候都是使用excel来做这些事情,非常方便,但是时间久了发现,每开一张表都要执行重复的操作,有没有一个方法可以把这些重复操作记录下来呢,答案是有的,office中的“宏”可以实现这个功能,但是学这个门槛有点高(主要是用处不那么大)。使用编程可以把我们执行的一系列操作存储起来,下次可以继续使用,那我们如何在python这样的环境下进行数据预处理呢?
那就不得不提到咱们最受欢迎的工具之一了——pandas
一、何为pandas
** pandas是一款强大的数据处理与分析工具。**
本人认为认识一个事物最好的方法是清楚其定位,通俗来讲就是它是什么,可以用来干嘛。
二、如何使用pandas
1.导入pandas库
哎,库是什么?
可以将“库”理解为一系列功能的集合,别人已经写好了,我们拿来用就可以了。
import pandas
运行上述代码后,程序并不能够正常工作。使用import就是告诉了程序去找pandas,可是pandas并不是python自带的,咱们也没有安装pandas,所有程序动不了。
通常情况下我们需要使用的库放在本地“Lib/site-packages”下,我们下载pandas库可以使用很多方法,只要咱们的程序能够在指定位置找到它就可以了,下面介绍本人常用的两种方法。
1.1 使用pip命令安装
按住“win+R”后输入“cmd”,在命令行中输入以下命令可安装pandas库
pip install pandas
可是这个方法下载速度着实让人堪忧,网上提供了很多种方法调整下载速度,大家可以自行查阅。经过本人测试,在pycharm中下载pandas花费的时间更短。
依次点击“File - Settings - Project: - Python Interpreter”点击左下角“+”搜索“pandas”,在搜索结果中选中并点击“install package”即可。
1.2 直接放入site-packages目录
对于网络条件不好或者没有网络的小伙伴来说,上述pip方法使用不了,但是我们知道python会在其安装目录下的“Lib/site-packages”目录中找对应的库,所有咱们只需要从其他地方拷贝一份放入其中就可以了,但是注意两台计算机python的版本应当相同。
以本人为例,我的python放在E盘中,所以从其他项目下拷贝所有前缀为“pandas”的文件夹并放入下列路径中就可以让程序正常运行了。
E:\Python\Lib\site-packages
1.3 常见问题
找不到“openpyxl”库,使用pip命令或者在pycharm中下载即可;
找不到“six”库,使用pip命令或者在pycharm中下载即可。
2.读取数据文件
有一个名为“data.xlsx”的文件,包含“USoft”和“CSoft”两个工作表,现在读取名为“CSoft”的工作表。
数据 = pandas.read_excel("data.xlsx",sheet_name="CSoft")
print(数据)
除了excel文件外,pandas还可以读取后缀为csv、xml、json的文件,大家根据自己的需求选择即可。
3.pandas主要的两种数据结构
使用pandas读取文件后可以像在Excel中一样对数据进行操作了,在Excel中我们是通过鼠标点击来选择和编辑单元格或者某一区域的,那在pandas中该如何操作呢?
这里不得不提一下pandas中最重要的两种数据结构了。
3.1 理解Series
Series的中文翻译是“系列”,它是一种一维的数据结构,类似与python中的列表。在一张表格(表格包含行和列,是二维结构)中,每一列都可以看做是一个Series(一维的),多个Series就组成了一个DataFrame。
3.1.1 从列表到Series
import pandas
数据 = ["张三","李四",1000,"hello"]
第一个series = pandas.Series(数据)
print(第一个series)
print(第一个series[0])
print(第一个series[3])
使用列表创建一个Series,类似于列表,Series可以通过“索引”来获取对应位置的值,注意,此时代码后两行的“0”和“3”是“索引”而不是“下标”,可以理解为此时“0”和“3”的数据类型为str,而不是“int”。
3.1.2 自定义索引
为了验证上述内容,我们将索引“0,1,2,3”改为其他内容,尝试使用原方法能否取出数据。
数据 = ["张三","李四",1000,"hello"]
第二个series = pandas.Series(数据,index=["第一个数据","第二个数据","three",4])
print(第二个series)
print(第二个series[0])
print(第二个series[1])
运行上述代码程序报错。除了单个取值外,我们还可以一次性取出多个数据,我们用一个列表将这些索引存起来,然后再放入Series中。
例如同时取出索引为“three”和“第一个数据”的值,先使用列表将其存起来[“three”,“第一个数据”],接着将其放入Series中第二个series[[“three”,“第一个数据”]],虽然这样看起来比较奇怪,但是没有任何问题。
数据 = ["张三","李四",1000,"hello"]
第二个series = pandas.Series(数据,index=["第一个数据","第二个数据","three",4])
print(第二个series)
print(第二个series[["three","第一个数据"]])
3.1.3 从字典到Series—自带索引
可以将字典转换为Series,此时字典的“Key”会变为对应“Value”的索引,还可以通过切片方式取出两个索引间的全部数据。注意:索引不同于下标,索引的左右范围均能取到,而下标表示的切片是一个左闭右开区间。
数据 = {"1号":"张三","2号":"李四","3号":"王五"}
第三个series = pandas.Series(数据)
print(第三个series)
print(第三个series["1号":"3号"])
3.2 理解DataFrame
DataFrame与Series并无很大区别,只不过是多个Series组合起来的的罢了。
3.2.1 从列表到DataFrame
使用列表创建Series时是一个列表转换为一个Series,使用列表创建DataFrame就是在参数中多放入几个列表。
import pandas
数据 = [[100,200,300],[400,500,600]]
第一个dataframe = pandas.DataFrame(数据)
print(第一个dataframe)
与Series不同的是DataFrame拥有行和列两种索引,参数中列表的个数就是DataFrame的行数,每个列表中的元素个数就是DataFrame的列数。
3.2.2 自定义索引
同样,咱们也能够根据自己的需求自定义DataFrame的索引,因为行、列索引包含多个,索引使用列表先存起来,再放入DataFrame的参数中。
数据 = [[100,200,300],[400,500,600]]
列索引 = ["第一列","第二列","第三列"]
行索引 = ["第一行","第二行"]
第二个dataframe = pandas.DataFrame(数据,columns=列索引,index=行索引)
print(第二个dataframe)
运行效果为:
3.2.3 从字典到DataFrame—自带列索引
使用字典创建Series时“Key”会自动转换为索引,那DataFrame中包含两种索引,那“Key”会转换成什么呢?
字典中的“Key”会转换为“列索引”。
数据 = {"第一列":[100,200,300],"第二列":[400,500,600]}
第三个dataframe = pandas.DataFrame(数据)
print(第三个dataframe)
运行效果为:
4.操作(查询)数据
我们可以将“DataFrame”看做一张表,对数据表的操作也就“增删改查”四种,其中查询操作是其他操作的基础,从查询内容的大小来看可以由查询某一区域、查询列、查询行、查询某一单元格几种情况。
4.1 查询列
pandas中查询某一列的操作非常简单,按照“对象名[列索引]”的方式就可以获取相应数据。
#步骤一
import pandas
#步骤二
数据 = pandas.read_excel("data.xlsx",sheet_name="CSoft")
print(数据)
#步骤三
print("分隔符**************************************")
应收票据 = 数据["应收票据"]
print(应收票据)
同样,咱们也可以同时查询多列数据。
#步骤四
print("分隔符**************************************")
应收票据与应收账款 = 数据[["应收票据","应收账款"]]
print(应收票据与应收账款)
4.2 查询某一单元格
使用“对象名[列索引][行索引]”的方式可以定位到指定单元格,类似于JAVA中的二维数组。
#步骤五
print("分隔符**************************************")
一五年应收账款 = 数据["应收账款"][4]
print("2015年应收账款为{}".format(一五年应收账款))
4.3 查询行
使用“对象名[[:]][[行索引范围]]”的方式可以获取某一行或者某多行的数据,但是这种方法书写起来并不方便,也不利于理解,所有我们使用新的方法替换原来臃肿的表达式。
loc与iloc是pandas种自带的两个函数,可以通过这两种方法轻易的获取对应数据。那iloc和loc有什么区别呢?用谁比较好呢?
首先回答第二个问题,两者没有好坏之分,只有个人习惯问题;第一个问题,loc是按照索引来获取数据,iloc是按照行号(下标)来获取数据,大家可以根据个人喜好选择方法。
#步骤六
print("分隔符**************************************")
一八年应收票据 = 数据.loc[1,"应收票据"]
一九年应收票据 = 数据.iloc[0,1]
print("一八年应收票据{}".format(一八年应收票据))
print("一九年应收票据{}".format(一九年应收票据))
在loc方法中“【1,“应收票据”】的1”代表行标签名字,是str型;
在iloc方法中【0,1】表示的是第一行第二列的单元格数据。
4.4 查询某一区域
同样使用iloc和loc方法查询某一区域的数据,此时只需要将单个的行或列替换为列表或者切片就可以了。
#步骤七
print("分隔符**************************************")
近五年应收票据 = 数据.loc[0:4,"应收票据"]
近五年应收账款 = 数据.iloc[0:5,2]
print("近五年应收票据为:")
print(近五年应收票据)
print("近五年应收账款为:")
print(近五年应收账款)
在loc方法中【0:4,.“应收票据”】表示的是从索引“0”到索引“4”的所有行,即5行数据;
在iloc方法中【0:5,2】表示从下标0到下标5之间的所有行,不包含下标为5的行,也是5行数据。
5.pandas中其他常用方法
#其他方法
数据.info() #显示数据整体信息
数据.head(10) #显示文件前10行数据
数据.tail(12) #显示文件后12行数据
这些方法常常用于查看数据表的信息,对于数据处理有一定的帮助,了解即可。