目录

3.2处理文件和文件夹的模块——os

3.2.1获取当前运行的Python代码文件路径

3.2.2列出指定路径下的文件夹包含的文件和文件夹名称

3.2.3分离文件主名和扩展名

3.2.4重命名文件和文件夹

3.3批量处理Excel文件的模块——xlwings

3.3.1创建工作薄

3.3.2保存工作薄

3.3.3打开工作薄

3.3.4操控工作表和单元格

3.4数组计算的数学模块——NumPy

3.4.1数组的基础知识

3.4.2数组的创建

3.5数据导入和整理模块——pandas

3.5.1二维数据表格DataFrame的创建与索引的修改

3.5.2文件读取与写入

 3.5.3数据的选取和处理

3.5.4数据表的拼接

3.6模块的交互

3.6.1xlwings模块与pandas模块的交互

3.6.2xlwings模块与Matplotlib模块的交互


3.2处理文件和文件夹的模块——os

3.2.1获取当前运行的Python代码文件路径

import os
path=os.getcwd()
print(path)

'''
E:\数据分析师学习\jupyter notebook
'''

3.2.2列出指定路径下的文件夹包含的文件和文件夹名称

import os
path='E:\数据分析师学习\jupyter notebook'  #指定路径
os.listdir(path)  #指定路径下所有文件名

3.2.3分离文件主名和扩展名

import os
path='example.xlsx'
os.path.splitext(path)

'''
('example', '.xlsx')
'''

可以看到,splitext()函数返回的是一个包含两个元素的元组,前一个元素是文件名,后一个元素的扩展名:('example', '.xlsx')

3.2.4重命名文件和文件夹

os模块中的rename()函数可以重命名文件和文件夹,该函数的与噶格式如下:

rename(src,dst)

import os
oldname='E:\数据分析师学习\jupyter notebook\Tree.txt'  #该目录下的文件Tree.txt文件
newname='E:\数据分析师学习\jupyter notebook\Tree1.txt'#该改成Tree1.txt文件
os.rename(oldname,newname)

还可以更改改名后文件存储的位置 

import os
oldname='E:\数据分析师学习\jupyter notebook\Tree1.txt'  #该目录下的文件Tree1.txt文件
newname='E:\Tree.txt'#更名后保存到另一个文件夹中
os.rename(oldname,newname)

 用rename()函数重命名文件夹和重命名文件的方法类似,件文件的路径改为文件夹的路径:

import os
oldname='E:\数据分析师学习\mysql'  #该目录下的文件夹
newname='E:\数据分析师学习\mysql1'#重命名文件夹名
os.rename(oldname,newname)

3.3批量处理Excel文件的模块——xlwings

可以处理Excel文件的Python模块有很多,如XlsxWriter、xlrd、xlwt、xlutils、openpyxl和xlwings等,下表对各模块的功能进行了简单对比。

功能/模块

XlsxWriter

xlrd

xlwt

xlutils

openpyxl

xlwings


×


×






×





修改

×

×

×




支持xls格式

×




×


支持xlsx格式




×



支持批量操作

×

×

×

×

×


通过上表的对比发现,xlwings模块的功能是最齐全的,它不仅能读、写和修改两种格式的Excel文件(xls和xlsx),而且还能批量处理多个Excel文件。

3.3.1创建工作薄

  • visible用于设置Excel程序窗口的可见性,True为可见,False为隐藏
  • add_book用于设置启动Excel程序窗口是否为新建工作薄,True为新建,False为不新建
  • add()为books对象的函数,用于新建工作薄
import xlwings as xw
app=xw.App(visible=True,add_book=False)
#visible用于设置Excel程序窗口的可见性,True为可见,False为隐藏
#add_book用于设置启动Excel程序窗口是否为新建工作薄,True为新建,False为不新建

workbook=app.books.add() #add()为books对象的函数,用于新建工作薄

3.3.2保存工作薄

如果要对上面的文件进行保存,代码如下:

workbook.save(r'C:\Users\Administrator\Desktop\example.xlsx')  #保存到桌面,命名为example.xlsx
workbook.close()  #关闭工作薄
app.quit()  #退出Excel程序

绝对路径:'C:\\Users\\Administrator\\Desktop\\example1.xlsx'就是一个绝对路径,代码也可以写成r'C:\Users\Administrator\Desktop\example.xlsx',代码中的r用来取消路径中反斜杠"\"的转义功能。

相对路径:如果将代码写成workbook.save('.\example1.xlsx')或者workbook.save('example1.xlsx')那么就会在代码文件的文件夹下创建一个名为example1.xlsx的工作薄。

3.3.3打开工作薄

import xlwings as xw
app=xw.App(visible=True,add_book=False)
workbook=app.books.open(r'C:\Users\Administrator\Desktop\example.xlsx')
#打开指定目录下的文件

3.3.4操控工作表和单元格

继3.3.3打开的工作薄进行操作

worksheet=workbook.sheets['Sheet1']  #选中工作表的sheet1表
worksheet.range('A1').value='编号'  #将A1单元格填上编号

如果想新增sheet表,可以进行如下代码:

import xlwings as xw
app=xw.App(visible=True,add_book=False)
workbook=app.books.open(r'C:\Users\Administrator\Desktop\example.xlsx')
#打开指定目录下的文件
worksheet=workbook.sheets.add('产品统计表')

综合应用:

import xlwings as xw
app=xw.App(visible=False) #启动程序,不打开的意思
workbook=app.books.add() #新建表格
worksheet=workbook.sheets.add('产品统计表') #表格中新增‘产品统计表’
worksheet.range('A1').value='编号'  #‘产品统计表中的A1单元格附上编号’
workbook.save(r'C:\Users\Administrator\Desktop\example2.xlsx')  #保存workbook
workbook.close()  #关闭表格
app.quit()  #退出excel 程序

3.4数组计算的数学模块——NumPy

NumPy模块名称是由‘Numerical Python’缩写而来,这个模块是一个运行速度非常快的数学模块,主要用于数组计算。

3.4.1数组的基础知识

import numpy as np
a=[1,2,3,4]
print(a)
print(type(a))

b=np.array([1,2,3,4])
print(b)
print(type(b))
[1, 2, 3, 4]  #列表的展现形式
<class 'list'>  #变量a的数据类型是列表

[1 2 3 4]  #数组的展现形式
<class 'numpy.ndarray'>   #变量b的数据类型是数组

提取列表和数组中的元素

print(a[1])  #2
print(b[1])  #2
print(a[0:2])  #[1, 2]
print(b[0:2])  #[1 2]

从运行结果可以看出,列表和数组有着相似的元素索引机制,唯一的区别就是数组中的元素用空格隔开,而列表中的元素用逗号隔开。那么NumPy模块为什么不直接使用列表来组织数据,而要引用数组这一新的数据结构呢?原因有很多,这里主要讲两点。

第一,数组能很好地支持一些数学运算,而用列表来完成这些数学运算则较为麻烦:

import numpy as np
a=[1,2,3,4]
b=np.array([1,2,3,4])
a*2  #[1, 2, 3, 4, 1, 2, 3, 4]
b*2  #array([2, 4, 6, 8])

同样的运算,列表是把元素复制了一遍,而数组则对每个元组进行了计算。

第二,数组可以存储多维数据,而列表通常只能存储一维数据:

import numpy as np
e=[[1,2],[3,4],[5,6]]
f=np.array([[1,2],[3,4],[5,6]])
print(e)
print(f)

输出结果:

[[1, 2], [3, 4], [5, 6]]

[[1 2]
 [3 4]
 [5 6]]

可以看到,列表e虽然包含了3个小列表,但其结构是一维的,而数组f则是3行2列的二维结构,这也是之后要学习的pandas模块的核心概念之一,因为数据处理中经常用到二维数据,及二维的表结构。

3.4.2数组的创建

import numpy as np
#创建一维数组
a=np.array([1,2,3,4])
#创建二维数组
b=np.array([[1,2],[3,4],[5,6]])

除此之外,还有一些常见的创建数组的方式,以一维数组为例,可以使用np.arange()函数来创建一维数组,该函数的括号里可以输入1-3个参数,会得到不同的效果。

import numpy as np
x=np.arange(5)  
print(x)  #[0 1 2 3 4]
y=np.arange(5,10)
print(y)  #[5 6 7 8 9]
z=np.arange(5,10,2)  #以步长为2进行创建
print(z)  #[5 7 9]

还可以用np.random中的函数创建随机一维数组。

#np.random.randn(3) 创建一个一维数组,其中包含服从正态分布的3个随机数
np.random.randn(3) 

#array([ 0.81622131, -0.68649247,  0.83856553])

reshape()函数可以改变数组的维数

d=np.arange(12).reshape(3,4)

'''
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
'''

这里再简单介绍一种创建随机整数二维数组的方法

np.random.randint(0,10,(4,4))  #随机创建0-9的4*4的数组

'''
array([[5, 2, 1, 6],
       [4, 9, 9, 2],
       [7, 1, 2, 0],
       [0, 9, 4, 7]])
'''

3.5数据导入和整理模块——pandas

pandas模块是基于NumPy模块的一个开源Python模块,广泛应用于完成数据快速分析、数据清洗和准备等工作,它的名字来源于‘panel data’。

与NumPy模块相比,pandas模块擅长处理二维数据,其主要有Series和DataFrame两种数据结构。

Series类似于通过NumPy模块的一维数组,不同的是Series对象不仅包含数值,还包含一组索引。

import pandas as pd
pd.Series(['丁一','王二','张三'])

'''
0    丁一
1    王二
2    张三
dtype: object
'''

3.5.1二维数据表格DataFrame的创建与索引的修改

1.DataFrame的创建

DataFrame可以通过列表、字典或二维数组创建,下面分别介绍具体方法:

(1)通过列表创建DataFrame

利用pandas模块中的DataFrame()函数可以基于列表创建DataFrame

import pandas as pd
pd.DataFrame([[1,2],[3,4],[5,6]])

'''
	0	1
0	1	2
1	3	4
2	5	6
'''

之前NumPy创建的二维数组进行比较:

超简单用Python让ezcel飞起来案例 python让excel飞起来_后端

通过比较,DataFrame更像Excel中的二维表格,它有行索引和列索引,注意索引是从0开始的。

我们还可以创建DataFrame自定义索引

pd.DataFrame([[1,2],[3,4],[5,6]],columns=['data','score'],index=['A','B','C'])

'''
	data	score
A	1	2
B	3	4
C	5	6
'''

columns用于指定列索引名称,参数index用于指定列索引名称。下面另一种方法:

a=pd.DataFrame()
data=[1,3,5]
score=[2,4,6]
a['data']=data
a['score']=score
a

'''
	data	score
0	1	2
1	3	4
2	5	6
'''

(2)通过字典创建:

pd.DataFrame({'data':[1,3,5],'score':[2,4,6]},index=['A','B','C'])

'''
	data	score
A	1	2
B	3	4
C	5	6
'''

如果想以字典的键名作为行索引,可以用from_dict()函数将字典转换成DataFrame,同时设置参数orient的值为‘index’:

pd.DataFrame.from_dict({'data':[1,3,5],'score':[2,4,6]},orient='index')

'''
	0	1	2
data	1	3	5
score	2	4	6
'''

(3)通过二维数组创建DataFrame

a=np.arange(12).reshape(3,4)
pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D'])

'''
	A	B	C	D
1	0	1	2	3
2	4	5	6	7
3	8	9	10	11
'''

2.DataFrame索引的修改

a=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['A','B','C'])
a.index.name='公司'
a

'''
	date	score
公司		
A	1	2
B	3	4
C	5	6
'''

如果想要重命名索引,可以使用rename()函数,在上述4行代码的第3行代码后面输入如下代码:

a=a.rename(index={'A':'万科','B':'阿里','C':'百度'}
           ,columns={'date':'日期','score':'分数'})

'''
	日期	分数
公司		
万科	1	2
阿里	3	4
百度	5	6
'''

如果想将行索引转换为常规列,可以用reset_index()函数重置索引

a=a.reset_index()

'''
	公司	日期	分数
0	万科	1	2
1	阿里	3	4
2	百度	5	6
'''

如果想把常规列转换成行索引,例如将‘日期’列转换成行索引:

a.set_index('日期')

'''
	公司	分数
日期		
1	万科	2
3	阿里	4
5	百度	6
'''

3.5.2文件读取与写入

1.文件读取

import pandas as pd
data=pd.read_excel(r'C:\Users\Administrator\Desktop\example2.xlsx'
                  ,sheet_name=0  #用于指定文件名称,也可以是数字,默认0,即第一个工作表
                  ,encoding='utf-8' #避免中文乱码
                  ,index_col=0 #用于设置索引列
                  )

2.文件写入

import pandas as pd
data=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['A列','B列'])
data.to_excel(r'C:\Users\Administrator\Desktop\example1.xlsx')

超简单用Python让ezcel飞起来案例 python让excel飞起来_数据_02

参数设置:

  • sheetname用于指定工作表的名称
  • index用于指定是否写入行索引信息,默认为True,即将行索引信息存储在输出文件的第一列,若设置成False,则忽略行索引信息
  • columns用于指定要写入的列
  • encoding用于指定编码方式

 3.5.3数据的选取和处理

(1)按列选取数据

#创建数据
a=np.arange(1,10).reshape(3,3)
data=pd.DataFrame(a,columns=['c1','c2','c3'],index=['r1','r2','r3'])

'''
	c1	c2	c3
r1	1	2	3
r2	4	5	6
r3	7	8	9
'''

data['c1']
'''
r1    1
r2    4
r3    7
Name: c1, dtype: int32
'''

data[['c1']]
'''
	c1
r1	1
r2	4
r3	7
'''

#选取多列
data[['c1','c3']]
'''
	c1	c3
r1	1	3
r2	4	6
r3	7	9
'''

 (2)按行选取数据

data.iloc[1:3]

pandas模块官方推荐使用iloc方法来选取行序号

data.iloc[-1]

除了根据序号选取数据外,还可以使用loc方法根据行名称来选取数据

data.loc[['r1','r3']]

(3)按区块选取数据

data[['c1','c2']][0:2] 或者data[0:2][['c1','c2']]

在实战中选取区块数据时,通常先用iloc方法进行选取行,再选取列,代码如下:

data.iloc[1:3][['c1','c2']]

如果要选取单个数据,该方法更有优势:

data.iloc[0]['c3']

也可以使用iloc和loc方法同时选取行和列

data.loc[['r1','r2'],['c1','c3']]

data.iloc[0:2,[0,2]]

loc方法使用字符串作为索引,iloc方法使用数字作为索引。

2.数据的筛选

data[data['c1']>1]  #选择c1列中数据大于0的行

筛选c1列中数字大于1且c2列中数据等于5的行:

data[(data['c1']>1)&(data['c2']==5)]

3.数据的排序

使用sort_values()函数可以按列对数据进行排序,例如对c2列进行排序

data.sort_values(by='c2',ascending=False) #ascending=False按降序排列

'''
c1	c2	c3
r3	7	8	9
r2	4	5	6
r1	1	2	3
'''

使用sort_index()函数可以按行索引进行排序,例如行索引的降序排列:

data.sort_index(ascending=False)

'''
	c1	c2	c3
r3	7	8	9
r2	4	5	6
r1	1	2	3
'''

4.数据的运算

data['c4']=data['c1']+data['c3']

c1列的数据+c3列的数据,生成新列c4

5.数据的删除

使用drop()函数可以删除DataFrame中指定数据,

index用于指定要删除的行

columns用于指定要删除的列

inplace默认值为False,表示该删除操作不改变原DataFrame,而是返回一个执行删除操作后的新DataFrame,如果设置为True,则会直接在原DataFrame中进行删除操作。

c=data.drop(columns='c4')

删除多列数据时,要以列表的形式给出列索引

c=data.drop(columns=['c4','c3'])

如果要改变原来的数据结构,比如之前是3*3的数据结构

data.drop(index=['r1','r3'],inplace=True)

使用以上代码后变成(1,3)的数据结构了。

3.5.4数据表的拼接

pandas模块还提供了一些高级功能,其中数据合并与重塑功能为两个数据表的拼接提供了极大的便利,只要涉及merge() concat() append()函数,其中merge()函数使用的比较多。

import pandas as pd
df1=pd.DataFrame({'公司':['恒盛','创锐','快学'],'分数':[90,95,85]})
df2=pd.DataFrame({'公司':['恒盛','创锐','京西'],'股价':[20,180,30]})

超简单用Python让ezcel飞起来案例 python让excel飞起来_数据_03

超简单用Python让ezcel飞起来案例 python让excel飞起来_数据_04

1.merge()函数

pd.merge(df1,df2)

 

超简单用Python让ezcel飞起来案例 python让excel飞起来_开发语言_05

可以看到,merge()函数直接根据相同的列名(‘公司’列)对两个数据表进行了合并,而且默认选取的是两个表共有的列内容(‘恒盛’,‘创锐’)。如果同名的列不止一个,可以通过设置参数on指定按照哪一列进行合并,代码如下: 

pd.merge(df1,df2,on='公司')

默认的合并方式其实是取交集(inner连接),即选取两个表共有的内容。如果想取并集(outer连接),即选取两个表所有的内容,可以设置参数how,代码如下:

pd.merge(df1,df2,how='outer')

超简单用Python让ezcel飞起来案例 python让excel飞起来_数组_06

如果想保留左表(df1)的全部内容,对右表(df2)不太在意的话,用 how='left'

pd.merge(df1,df2,how='left')

超简单用Python让ezcel飞起来案例 python让excel飞起来_python_07

反之,对右表保留全部:

pd.merge(df1,df2,how='right')

 

超简单用Python让ezcel飞起来案例 python让excel飞起来_数组_08

如果想按照索引进行合并,可以设置参数left_index和 right_index,需要同时使用

pd.merge(df1,df2,left_index=True,right_index=True)

超简单用Python让ezcel飞起来案例 python让excel飞起来_数组_09

2.concat()函数

concat()函数使用全连接(union all)方式完成拼接,他不需要对齐,而是直接进行合并,既不需要两个表有相同的列和索引,只是把数据整合到一起。因此,该函数没有参数how和on,而是用参数axis指定连接的轴向,该参数默认值为0,指定行方向连接(纵向连接)。

pd.concat([df1,df2],axis=0)

超简单用Python让ezcel飞起来案例 python让excel飞起来_开发语言_10

pd.concat([df1,df2],axis=1)

 

超简单用Python让ezcel飞起来案例 python让excel飞起来_数据_11

3.append()函数

append()函数可以看成concat()函数的简化版,效果和pd.concat([df1,df2])类似,实现的也是纵向拼接:

df1.append(df2)

append()函数还有一个和列表的append()函数一样的用途——新增元素,代码如下:

df1.append({'公司':'腾飞','分数':'90'},ignore_index=True)

这里一定要设置参数ignore_index=True来忽略原索引,否则会报错。

超简单用Python让ezcel飞起来案例 python让excel飞起来_python_12

3.6模块的交互

3.6.1xlwings模块与pandas模块的交互

例如:用pandas模块创建的数据表格,再用xlwings模块将表格写入工作薄中。

import pandas as pd
import xlwings as xw
df=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])

app=xw.App(visible=False)
workbook=app.books.add()
worksheet=workbook.sheets.add('新工作表2')

worksheet.range('A1').value=df

workbook.save(r'C:\Users\Administrator\Desktop\example4.xlsx')
workbook.close()
app.quit()

超简单用Python让ezcel飞起来案例 python让excel飞起来_数组_13

3.6.2xlwings模块与Matplotlib模块的交互

例如用Matplotlib模块绘制图表,再用xlwings写入到excel中

import xlwings as xw
import matplotlib.pyplot as plt
#绘图
figure=plt.figure()
x=[1,2,3,4,5]
y=[2,4,6,8,10]
a=plt.plot(x,y)
#建表
app=xw.App(visible=False)
workbook=app.books.add()
worksheet=workbook.sheets.add('新的工作表')

#将绘制的图表写入工作薄中
worksheet.pictures.add(figure,name='图片1'
                       ,update=True #后续更改图标时,可以只更新图表数据而不更改其位置和大小
                       ,left=100  #表示让图表距离左侧边界100像素,top设置距离顶端的参数
                      )
workbook.save(r'C:\Users\Administrator\Desktop\example5.xlsx')
workbook.close()
app.quit()