Python Excel实战基础部分
1.1文件的读取和写入
通过pandas模块可以从多种格式文件中读取数据,也可以将处理后的数据写入这些文件当中
1.1.1文件读取
1 import pandas as pd 2 data = pd.read_excel('example.xlsx')#read_excel()函数设置的文件路径参数是相对路径,即代码文件所在的路径,也可设置为绝对路径(r'h:\example.xlsx')
- sheetname 用于指定工作表,可以是工作表名称,也可以是数字(默认为0,即第1个工作表)
- encoding 用于指定文件的编码方式,一般设置为UTF-8或者GBK编码,以免中文乱码
- index_col 用于设置索引列
例如,要以BTF-8的编码方式读取工作簿“example。xlsx”的第一个工作表:
data = pd.read_excel('example.xlsx',sheet_name=0,encoding='utf-8')
关于pandas模块读取CSV文件,CSV文件本质上是一个文本文件,它仅存储数据,不能像Excel那样存储格式、公式、宏等信息,所以占用存储空间通常较小,CSV文件一般用逗号分隔。
1 data = pd.read_csv('data.csv')
read_csv()函数的常用参数
- delimiter 用于指定CSV文件的数据分隔符,默认为逗号。
- encoding 用于指定文件的编码方式,一般设置为UTF-8或GBK编码,以避免中文乱码。
- index_col 用于设置索引列
例如:要以UTF-8编码方式读取CSV文件’data.csv‘,以逗号作为数据的分隔符:
1 data = pd.read_csv('data.csv',delimiter=',',encoding='utf-8')
1.2文件写入
1 import pandas as pd 2 data = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['A列','B列'])#创建一个DataFrame 3 data.to_excel(r'h:\\example.xlsx')#将DataFrame中的数据写入绝对路径对应xlxs文件中的工作簿
图中,行索引被存储在工作表的第1列中,如果想写入数据时不保留行索引信息,可以设置to_excel()函数的参数
- sheet_name 用于指定工作表名称
- index 用于指定是否写入行索引信息,默认为True,即将行索引信息存储在输出文件的第一列;若设置为False,则忽略行索引信息
- columns 用于指定要写入的列
- encoding 用于指定编码方式。
1 import xlwings as xw 2 app = xw.App(visible = True, add_book = False) 3 workbook = app.books.add() 4 workbook.save(r'h:\1.xlsx') 5 workbook.close() 6 app.quit() #以上部分为前面内容的复习,用xlwings模块来创建并命名excel文件 7 import pandas as pd 8 data = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['A列','B列']) 9 data.to_excel(r'h:\1.xlsx',index=False,sheet_name=('Yi'))

1.3数据的选取
创建一个3行3列的DataFrame用于练习,行索引indexc1,c2,c3;列索引r1,r2,r3。两种方式如下
1 import pandas as pd 2 import numpy as np 3 data = pd.DataFrame([[1,2,3],[4,5,6],[6,7,8]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 4 data1 = pd.DataFrame(np.arange(1,10).reshape(3,3),columns = ['c1','c2','c3'],index=['r1','r2','r3']) 5 print(data) 6 print(data1)
c1 c2 c3
r1 1 2 3
r2 4 5 6
r3 7 8 9
c1 c2 c3
r1 1 2 3
r2 4 5 6
r3 7 8 9
1.3.1:按列选取
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data['c1'] 4 print(a)
r1 1 r2 4 r3 7 Name: c1, dtype: int64
通过data[‘c1’]选取一列时选取的数据不包含列索引信息,返回的是一个一维的Series类似的数据
通过data[['c1']]选取
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data[['c1']] 4 print(a)
c1 r1 1 r2 4 r3 7
选取多列data[['c1','c3']]选出C1列和C3列(这里留下一个疑问没有解决如何选出1-50列)
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data[['c1','c3']] 4 print(a)
c1 c3 r1 1 3 r2 4 6 r3 7 9
1.3.2:按行选取
#选取第2-3行的数据,注意序号从0开始,左闭右开
a = data[1:3]
c1 c2 c3 r2 4 5 6 r3 7 8 9
a = data[1:3]可能会引起混淆报错,pandas模块的官方文档推荐使用iloc方法来根据行序号选取数据
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data.iloc[1:3] 4 print(a)
c1 c2 c3 r2 4 5 6 r3 7 8 9
如果要选取单行,就必须用iloc方法,例如,选取倒数第1行
a = data.iloc[-1]
如果直接用data[-1],则Python可能会认为-1是列名,容易导致报错。
还可以使用loc方法根据行的名称来选取数据
a = data.loc[['r2','r3']]
如果行数很多的话,可以用head()函数选取
a = data.head() #选取全部数据,head(5)选取前5行数据
1.3.3:按区块选取
例如:选取C1和C3列的前两行数据
a = data[['c1','c3']][0:2] #也可 a = data[0:2][['c1','c3']]
在实战中选取区块数据时,通常先用iloc方法选选行,再取列
a = data.iloc[0:2][['c1','c3']]
如果要选取单个数据,该方法就更有优势,例如,选取C3列第1行的数据,不能写成data['c3'][0]或data[0]['c3'],而要先用iloc[0]先选取第1行,再选取C3列
a = data.iloc[0]['c3']
也可以使用iloc和loc方法同时选取行和列
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data.loc[['r1','r2'],['c1','c3']] 4 b = data.iloc[0:2,[0,2]] 5 print(a) 6 print(b)
c1 c3
r1 1 3
r2 4 6
c1 c3
r1 1 3
r2 4 6
需要注意的是,loc方法使用字符串作为索引,iloc方法使用数字作为索引
loc是location(定位、位置)的缩写,所以是用字符串作为索引
iloc中多了一个字母i,而i又经常代表数字,所以使用数字作为索引
1.3.3:数据的筛选
通过再中括号里设定筛选条件可以过滤,例如,筛选c1列中数字大于1的行
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data[data['c1']>1] 4 print(a)
c1 c2 c3 r2 4 5 6 r3 7 8 9
如果有多个筛选条件,可以用“&”(表示‘且’)或“|”(表示或),例如,筛选C1列中数字大于1且C2列中数字等于5的行
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data[(data['c1']>1) & (data['c2'] == 5)] 4 print(a)
c1 c2 c3 r2 4 5 6
1.3.3:数据的排序
使用sort_values()函数可以按列对数据进行排序,列入,将data按C2列进行降序排序
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data.sort_values(by='c2', ascending=False) 4 print(a)
c1 c2 c3 r3 7 8 9 r2 4 5 6 r1 1 2 3
参数by用于指定按哪一列来排序;参数ascending("上升"的意思)默认值为Ture,表示升序排列,若设置为False则表示降序排列
使用sort_index()函数可以按行索引排序
1 import pandas as pd 2 data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) 3 a = data.sort_values(by='c2', ascending=False) 4 a = a.sort_index() 5 print(a)
c1 c2 c3 r1 1 2 3 r2 4 5 6 r3 7 8 9
1.3.4:数据的运算
通过数据运算可以基于已有的列生成新的一列
import pandas as pd data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ['c1','c2','c3'],index = ['r1','r2','r3']) data['c4'] = data ['c3'] - data['c1'] print(data)
1.3.5:数据的删除
使用drop()函数可以删除Dataframe中的指定数据,该函数的常用参数简单介绍如下:
- index用于指定要删除的行。
- columns用于指定要删除的列。
- inplace默认值为False,表示该删除操作不改变原DataFrame,而是返回一个执行删除操作后的新DataFrame,如果设置为True,则会直接在原DataFrame中进行删除操作。
例如:删除data中的c1列数据
a = data.drop(columns='c1')
删除多列数据时,要以列表的形式给出列索引,例如,删除C1和C3列
b = data.drop(columns['c1','c3'])
删除多行数据时,同样要以列表的形式给出行索引,例如,删除第1行和第3行
c = data.drop(index=['r1','r3'])
1.3.5:数据的拼接
pandas模块还提供了一些高级功能,其中的数据合并与重塑功能为两个数据表的拼接提供了极大的便利,主要涉及
merge()函数,concat()函数,append()函数,其中merge()函数用得较多。
import pandas as pd df1 = pd.DataFrame({'公司':['阿里','腾讯','百度'],'分数':[90,92,88]}) df2 = pd.DataFrame({'公司':['阿里','腾讯','拼多多'],'股价':[200,192,188]}) df3 = pd.merge(df1,df2)

1.merge()函数
merge()函数可以根据一个或多个同名的列将不同数据表中的行链接起来
df3 = pd.merge(df1,df2)
可以看到,merge()函数直接根据相同的列名(“公司”列)对两个数据表进行了合并,而且默认选取的是两个表共有的列内容(‘阿里’,‘腾讯’),
如果同名的列不止一个,可以通过设置参数on指定按照哪一列进行合并
df3 = pd.merge(df1,df2, on='公司')
默认的合并方式其实是取交集(inner连接),即选取两个表共有的内容。如果想并集(outer连接),即选取两个表所有的内容,可以设置参数how
df3 = pd.merge(df1,df2, how='outer')
运行后df3的内容见下表,可以看到所有数据都在,原来没有的数据则用控制NaN填充。

如果想保留(df1)的全部内容,而对右表(df2)不太在意,可将参数how设置为'left'
df3 = pd.merge(df1,df2,how='left')

此时df3完整保留了df1的内容('阿里','腾讯','百度')
如果想保留(df2)的全部内容,而对右表(df1)不太在意,可将参数how设置为'left'
df3 = pd.merge(df1,df2, how='right')
如果想按照行索引进行合并,可以设置参数left_index,和right_index,

2.concat()函数
concat()函数使用全连接(unionall)方式完成拼接,它不需要对齐,而是直接进行合并,即不需要两个表有相同的列或索引,只是把数据整合到一起。
因此,该函数没有参数how和on,而是用参数axis指定连接的轴向。该参数默认值为0,指按行方向连接(纵向拼接),该参数为1时为横向拼接。
df3 = pd.concat([df1,df2]) #或者写成df3 = pd.concat([df1,df2],axis=0)

此时的行索引为原来两个表各自的索引,如果想要重置索引,可以使用reset_index()函数,或在concat()函数中设置参数ignore_index为True来忽略
原有的索引,生成新的数字序列作为索引
df3 = pd.concat([df1,df2],ignore_index=True)
如果想按列方向连接,即横向拼接,可以设置参数axis为1
df3 = pd.concat([df1, df2], axis=1)

3.append()函数
append()函数可以堪称是concat()函数的简化版,效果和pd.concat([df1,df2])类似,实现的也是纵向拼接。
df3 = df1.append(df2)
append()函数还有一个和列表append()函数一样的用途——新增元素
df3 = pd.concat([df1,df2],ignore_index=True)

这里一定要设置参数ignore_index为True来忽略原索引,否则会报错。
浙公网安备 33010602011771号