第一章博主已经讲了对excel的基本读写,今天的整点在与基础python及利用pandas对excel工作表的行的操作
那么为了学习的继续,我们依然需要那三个excel文件,这个我们可以去一个地址下载:传送门
当然由于是外网github社区所以会比较慢,但是文件本身并没有特别大,所以小伙伴只需要等待片刻即可
文件:
筛选特定行(使行中的值满足某一条件)
基础Python操作
代码:
from datetime import date
from xlrd import open_workbook,xldate_as_tuple
from xlwt import Workbook
input_file="sales_2013.xlsx"
output_file="output.xlsx"
out_work=Workbook()#创建操作对象
out_sheet=out_work.add_sheet("jan_2013")
sales_index=3
with open_workbook(input_file) as workbook:
worksheet=workbook.sheet_by_name("january_2013")
data=[]
header=worksheet.row_values(0)
data.append(header)
for row_index in range(1,worksheet.nrows):
row_list=[]
sale=worksheet.cell_value(row_index,sales_index)
sale_amount=float(str(sale).strip("$").replace(",",""))
if sale_amount >1400:
for col_index in range(worksheet.ncols):
cell_value=worksheet.cell_value(row_index,col_index)
if worksheet.cell_type(row_index,col_index)==3:
date_cell=xldate_as_tuple(cell_value,workbook.datemode)
date_cell=date(*date_cell[0:3]).strftime("%m/%d/%Y")
row_list.append(date_cell)
else:
row_list.append(cell_value)
if row_list:
data.append(row_list)
print(list(enumerate(data)))#enumerate函数将一个可遍历的数据组合为一个索引对象,同时列出索引和下标 enumerate为动词本身具有列举枚举的意思
for list_index,out_list in enumerate(data):#
for element_index,element in enumerate(out_list):
out_sheet.write(list_index,element_index,element)
out_work.save(output_file)
这里不论是时间格式化还是其他的细节内容上一篇博主已经讲过,便不再多言
需要讲解的:
enumerate()函数,该函数是属于基本python的,
enumerate()函数:可以将列表,元组等数据类,分开为一个个单独的元素,且不可迭代,如下↓
利用pandas筛选特定行
代码:
import pandas as pd
input_file="sales_2013.xlsx"
out_file="output.xlsx"
data_frame=pd.read_excel(input_file,"january_2013",index_col=None)#重新设置一列为index
print(data_frame["Sale Amount"])
data_frame_value=data_frame[data_frame["Sale Amount"].astype(float)>1400]#.astype函数
writer=pd.ExcelWriter(out_file)
data_frame_value.to_excel(writer,sheet_name="jan_2013",index=False)
writer.save()
前文说过pandas含有处理excel的模块。
这里使用data_frame_value=data_frame[data_frame[“Sale Amount”].astype(float)>1400] 我们这里使用astype()函数对该数字进行判断。
后面的
writer=pd.ExcelWriter(out_file),表示创建写入的excel对象。
data_frame_value.to_excel(writer,sheet_name=“jan_2013”,index=False) 这里的index=False表示不显示索引
over
筛选特定行(使行中的值属于每一列表)
基础python实现
代码:
from datetime import date
from xlrd import open_workbook,xldate_as_tuple
from xlwt import Workbook
input_file="sales_2013.xlsx"
output_file="output.xlsx"
out_workbook=Workbook()
out_worksheet=out_workbook.add_sheet("jan_2013")
need_time=["01/27/2013","01/31/2013"]
time_index=4
with open_workbook(input_file) as workbook:
worksheet=workbook.sheet_by_name("january_2013")
data=[]
header=worksheet.row_values(0)#row_values()
data.append(header)
print(data)
for row_index in range(1,worksheet.nrows):
time_cell=xldate_as_tuple(worksheet.cell_value(row_index,time_index),workbook.datemode)
time_cell=date(*time_cell[0:3]).strftime("%m/%d/%Y")
row_list=[]
if time_cell in need_time:
for col_index in range(worksheet.ncols):
cell_value=worksheet.cell_value(row_index,col_index)
if worksheet.cell_type(row_index,col_index)==3:
date_cell=xldate_as_tuple(cell_value,workbook.datemode)
date_cell=date(*date_cell[0:3]).strftime("%m/%d/%Y")
row_list.append(date_cell)
else:
row_list.append(cell_value)
if row_list:
data.append(row_list)
for list_index,out_list in enumerate(data):
for index,element in enumerate(out_list):
out_worksheet.write(list_index,index,element)
out_workbook.save(output_file)
与上一段代码类似,有部分不同的地方
这里我需要补充一下最后这一段代码:
for list_index,out_list in enumerate(data):
for index,element in enumerate(out_list):
out_worksheet.write(list_index,index,element)
我们将enumerate(data)以list的形式打印出来:
那么这段代码便很容易理解了,第一个循环是在元组中遍历,第二个循环在元组的列表中遍历,实现将单元格的内容一五一十的写入
利用pandas实现
import pandas as pd
input_file="sales_2013.xlsx"
output_file="output.xlsx"
data_frame=pd.read_excel(input_file,"january_2013",index_col=None)
need_time=["01/24/2013","01/31/2013"]
data_frame_value=data_frame[data_frame["Purchase Date"].isin(need_time)]
writer=pd.ExcelWriter(output_file)
data_frame_value.to_excel(writer,sheet_name="jan_2013",index=False)#index=False表示输出不显示索引值
writer.save()
我们之前在讲csv文件处理的时候提到pandas处理类似这样问题的时候使用pandas带有的isin函数。
**data_frame_value=data_frame[data_frame[“Purchase Date”].isin(need_time)]**这段便是我们引用isin函数的地方,很好理解,形式更多的还是依靠记忆。
这里再重复一下之前的把内容
index_col=None重新设置一类为index
index=False输出不显示索引值