目录
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创建的二维数组进行比较:
通过比较,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')
参数设置:
- 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]})
1.merge()函数
pd.merge(df1,df2)
可以看到,merge()函数直接根据相同的列名(‘公司’列)对两个数据表进行了合并,而且默认选取的是两个表共有的列内容(‘恒盛’,‘创锐’)。如果同名的列不止一个,可以通过设置参数on指定按照哪一列进行合并,代码如下:
pd.merge(df1,df2,on='公司')
默认的合并方式其实是取交集(inner连接),即选取两个表共有的内容。如果想取并集(outer连接),即选取两个表所有的内容,可以设置参数how,代码如下:
pd.merge(df1,df2,how='outer')
如果想保留左表(df1)的全部内容,对右表(df2)不太在意的话,用 how='left'
pd.merge(df1,df2,how='left')
反之,对右表保留全部:
pd.merge(df1,df2,how='right')
如果想按照索引进行合并,可以设置参数left_index和 right_index,需要同时使用
pd.merge(df1,df2,left_index=True,right_index=True)
2.concat()函数
concat()函数使用全连接(union all)方式完成拼接,他不需要对齐,而是直接进行合并,既不需要两个表有相同的列和索引,只是把数据整合到一起。因此,该函数没有参数how和on,而是用参数axis指定连接的轴向,该参数默认值为0,指定行方向连接(纵向连接)。
pd.concat([df1,df2],axis=0)
pd.concat([df1,df2],axis=1)
3.append()函数
append()函数可以看成concat()函数的简化版,效果和pd.concat([df1,df2])类似,实现的也是纵向拼接:
df1.append(df2)
append()函数还有一个和列表的append()函数一样的用途——新增元素,代码如下:
df1.append({'公司':'腾飞','分数':'90'},ignore_index=True)
这里一定要设置参数ignore_index=True来忽略原索引,否则会报错。
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()
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()