最近师傅让我帮他整理下excel表格,我就自认为很简单的答应了,没想到是自己给自己挖了一个坑,哈哈。遇到了好多问题,因此,写一篇文章记录下。
其实,仔细分析,这个工作流无非就是
当然讲起来容易,中间也涉及到了一些具体的问题
pandas 读取excel
这里我接触了两种方法:
-
使用pandas.read_excel(“123.xlsx”)方法
这个方法返回一个DataFrame对象 ,对于有多个工作表的文件 ,会默认读取工作表1,也可以同过索引,来获得第几个表的数据,默认为0。df= pd.read_excel("123.xlsx",sheet_name=1)
然后,我们处理数据一般都是按行处理的,所以我们可以将数据按行输出
for index,values in df.iterrows(): print(index,values)
并且values 是一个Series对象,可以使用键名读取数据,很方便。
-
filepandas.ExcelFile(“123.xlsx”)
这个方法会返回一个ExcelFile 对象,这个方法适合一个文件中有好几个表格,然后我们可以按表格读取,做表格数据的合并。
我们可以通过sheet_names,获取一个列表,然后分列表的读取数据。for sheet_name in file.sheet_names: df_list.append(file.parse(sheet_name)) #通过这种方法,创建一个dataframe的list
对于DataFrame的操作,就可以像方法1那样,按行遍历了。
pandas 进行操作
这次的业务逻辑是,如果一篇文章的作者在一个花名册中存在,那么就保存这条文章记录,反之删除这条记录。但是数据集中有一些问题 ,比如有的名字中间有空格如
"李 明"
我们可以使用如下命令将空格除去:
cdf.fillna("null")# 填充空值
cdf.replace('\s+','',regex=True,inplace=True)#将两个字的名字 之间的空格去掉
同时手机号码会默认变成科学计数法的形式如:
手机号 1.865167e+10
这是因为我们默认数字使用浮点型存储,所以会出现如下形式,我们可以将浮点型的格式设置为不显示小数,使用如下命令
pd.set_option('display.float_format', lambda x: '%.0f' % x)
这涉及到的内容有将一条记录存入列表中,其他并没有什么难度,其代码逻辑如下:
new_excel=[]
for index,values in df.iterrows():
if values["成果来源"]=="合著" or values["作 者"] in name_list:#
new_excel.append(values)
pandas 导出excel
有了上述的new_excel列表,我们可以将其转化为一个DataFrame对象,然后导出到excel。和输出一样,如果是单个表,我们可以使用to_excel 去输出
df1.to_excel('e:/working_file/data.xlsx',sheet_name='sheet1')
对于有多个数据表,要输出到一个文件,可以使用`
save_path = 'e:/working_file/data.xlsx'
writer = pd.ExcelWriter(save_path)
df1.to_excel(writer,sheet_name='sheet1')
df2.to_excel(writer,sheet_name='sheet2')
writer.save()
#这就是将多个dataframe写入到一个文件的方法了。
但是输出结束后,你打开看看,会发现手机号那里还是科学计数法表示的,同时前面还多了序列,这时候就需要两个属性了,index=False
和float_format="%.0f"
0表示小数点后0位。
修改后代码如下
df.to_excel("'e:/working_file/data.xlsx'",index=False,float_format="%.0f")
以上就是pandas处理excel表格的工作流,有不足的后期补充。