如何用python处理excel,用python处理Excel
用Python整理Excel文件大致可以分为这几个过程:阅读-整理-写入。
有时候在书写的时候,需要按照规定的格式填写到指定的位置。这时候可以选择在整理的时候按照指定的位置整理出来,方便书写。
首先是模块选择,这里我选择了openpyxl,Pandas模块。Openpyxl操作Excel写的还是挺方便的,Pandas是用来整理数据的。
也是个不错的选择。
当数据源不是很标准时,排序过程需要很长时间。
先说我们的例子。这是我们工作中使用的桌子。表格数据其实很没有规律。
下面两个表可以看作是两个报表,都不是很好的数据源。所以整理数据源是第一大工作。
这是src表,包括pn列和日期列。
这是一个包含pn列、模型列和部分日期列的tg表。
===================这是分割线==================================
1.文件读取:
OpenXL: WB=load _ workbook (url )除了url之外还有几个参数可以选择:read_only[大文件时启用];Data_only[公式或值]
WB . sheet names获取工作表名称。
WB [工作表名称]获取工作表
工作表[a1]。value sheet.cell(行=1,列=1)。值获取指定的单元格值
获取行数和列数
工作表[ A1 : C3 ]获取指定的区域
Pandas: src=pd.read _ excel (url ,sheet _ name= ,header=0)有几个参数:sheet_name[可以写序列号,可以选择多张];Index_col[设置为索引列](此方法读取的数据为DataFrame格式)
src[ column ]读取指定的列数据
从openpyxl导入panda作为PD load _ workbook # read file src=PD . data frame(PD . read _ excel(/users/documents/code/python/excel/data source . xlsx ,sheet_name=0,header=2))tg=pd。Data frame(PD . read _ excel(/Users/Documents/Code/Python/excel/report . xlsx ,sheet_name=0,header=3))TG _ WB=load _ workbook(/Users/Documents/Code/Python/excel/report . xlsx ,Data _ only=True)src _ WB=load _ workbook(/Users/Documents/Code/Python/excel/Data source . xlsx ,Data _ only=True)TG _ sheet=TG _ WB[ sheet 1 ]src _ sheet=src
2.数据整理
定义:熊猫读取的数据可以定义序列src.set_index(index (index )
#设置索引
Df_src=src.set_index(pn )对于不规则序列,找出其分组等规则。
# src _ pn set src _ pn list=[]for pn in src[ pn ]:src _ pn list . append(pn)filter:确定一个基准列后,可以对其进行筛选。一般LOC用于筛选,LOC有更多的loc[1,列]。对于序列化的DataFrame,可以直接使用LOC [row , column]。Iloc一般是iloc[1,1]
遍历:排序时一般用tg=update(src)比较方便,但前提是顺序一致。当不一致时,我们需要自己重写。
特殊情况处理:当要写入的数据是nan时,不能写入新的数据,需要先判断pd.isna(),然后赋给0即可。
For i in range(0,tg.shape[0]): # If model为1 if tg.loc[i, model]==1: # If有元素iflen (tg.loc [i, pn])==1: for j in range (3,Tg.shape[1] 1): # Write in tg.loc [i,TG . columns[j-1]]=df _ src . loc[TG . loc[I, pn],tg.columns [j-1]] # If有split(/) #遍历pn_list中n的元素组:#如果数据源中src _ pn list有If n:#遍历range(3,tg.shape[1] 1)中k的目标:#如果目标单元格为空如果pd.isna(tg.loc[i,Tg.columns [k-1]]): TG.loc [I,TG.columns [k-1]]=0 #累计数tg.loc[i,TG . columns[k-1]]=df _ 1
至此,数据整理基本完成。
不要忘记给排序后的数据添加一个索引,并确定唯一值。
#添加排序索引-确认唯一值df _ tg=tg [tg [model]==1]。Set _ index (pn)===============我是分割线=========
直写:由于数据是按照要写的数据的格式排序的,所以写的过程比较简单。您可以使用单元格(行=1,列=1)。直接值。
最后,不要忘记WB.save (URL )
# df_tg pn在df _ tg.index中为df _ tg _ pn设置df _ Tg _ PN list=[]:df _ Tg _ PN list . append(df _ Tg _ PN)#在range中为I写入(5,Tg_sheet.max_row 1): #获取目标源的pn TG _ PN=TG _ sheet.cell (row=I,column=1)。如果目标源PN在数据帧中,则值#和model==1if(df _ TG _ PN列表中的TG _ PN)(TG _ sheet . cell(row=I,column=2)。value==1): #遍历范围内与j的日期相关的所有列(3,Tg _ sheet . max _ column 1):# assign Tg _ sheet . cell(row=I,column=j)。value=df _ tg.loc [TG _ pn,Df _ TG . columns[j-2]]# Write in Excel TG _ WB . save(/users/zean/documents/code/python/Excel/report new . xlsx )===================
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。