因为需要读取和处理的sheet表格比较多, 尝试重构并循环读取.
之前参考的博客代码有一点问题, 踩坑了, 所以重新整理一篇.
参考:
https://blog.csdn.net/weixin_43581124/article/details/108015535
这样写要快很多,以前相当于每个sheet都要读一遍整个excel文件,现在总共只需要读一遍excel文件
import pandas as pd def read_excel1(path): data_xlsx = pd.ExcelFile(path) print(data_xlsx.sheet_names) data=pd.DataFrame() for name in data_xlsx.sheet_names: df=data_xlsx.parse(sheet_name=name,converters={'外呼任务批次':str,'座席工号':str,'问卷调查结果':str}) # data[name]=df data = data.append(df) # print(df) print(name) return data path=r'C:\Users\Desktop\贷款\data.xlsx' data=read_excel1(path) |
其中converters代表强制'外呼任务批次'列为str类型.
要读取指定的列可以用usecols
参考:
https://www.cnblogs.com/yfacesclub/p/11232736.html
# usecols 可避免读取全量数据,而是以分析需求为导向选择特定数据,可以大幅提高效率 # 使用整型,从0开始,如[0,2,3] data = pd.read_excel(io, sheet_name = '车辆信息', usecols = [0, 1, 2]) # 想要读取第一列、第二列、和第三列的数据 data.head() # 可以使用Excel传统的列名“A”、“B”等字母,如“A:C, E” ="A, B, C, E",注意两边都包括 data = pd.read_excel(path, sheet_name = '车辆信息', usecols = 'A:C, E') data.head() |
读取标签信息
feature_file =r'./data/... .xlsx' label_file =r'./data/.. .xlsx' |
data_xlsx = pd.ExcelFile(label_file) print("sheet name:",data_xlsx.sheet_names) labels=pd.DataFrame() for name in data_xlsx.sheet_names: df=data_xlsx.parse(sheet_name=name,) # print(name,'label:\n',df) labels = labels.append(df) print(name,'label:\n',labels) |
查看拼接后数据发现有NaN, 单个sheet读取又没问题, 看DataFrame的append问题:
序列号 ... ... 0 2016001 0.0 0.0 0.0 0.0 NaN 1 2016002 0.0 0.0 0.0 0.0 NaN .. ... ... ... ... ... ... 845 2019100 NaN NaN NaN NaN 1.0 846 2019101 NaN NaN NaN NaN 1.0 |
新的sheet从之前的最后一个index之后才开始加的
参考:
https://blog.csdn.net/S_o_l_o_n/article/details/90383176
https://www.jianshu.com/p/e1c6eb3c3e4b
和index不一致有关
如果使用之前的合并方法:
pd.merge(table1,table2,on=['序列号'], how='left') |
因为parse读取不会读取重复的列'序列号', 所以会报错, key error
参考:
https://zhuanlan.zhihu.com/p/132579724
用索引作为拼接的主键同样会遇到索引值不一致, 最终得到空的问题
这篇文章把contact, merge和append讲得比较清楚:
https://zhuanlan.zhihu.com/p/70438557
设置index从0开始排序:
df = df.reset_index(drop=True) |
也不管用, 这是因为这些方法默认纵向拼接
DataFrame进行横向拼接, 参考:
https://www.cnblogs.com/aaronhoo/p/9323450.html
labels=pd.concat([labels,df],axis=1) |
成功
序列号 ... 0 2016001 0 0 0 0 2016001 1 2016001 ... |
选取所需的列, 参考:
https://zhuanlan.zhihu.com/p/96203752
list:可以为列数的集合或者列名的集合
df = pd.read_excel(r'成绩.xlsx', usecols=[0,1,2]**) df = pd.read_excel(r'成绩.xlsx', usecols=['班级', '姓名', '语文']**) |
同时遍历sheet列表的索引和值, 参考:
https://blog.csdn.net/lilongsy/article/details/80242536
for idx, val in enumerate(my_list): |
data_xlsx = pd.ExcelFile(label_file) # print("sheet name:",data_xlsx.sheet_names) labels=pd.DataFrame() for idx, name in enumerate(data_xlsx.sheet_names): df=data_xlsx.parse(sheet_name=name,usecols=[label_name[idx]]) labels=pd.concat([labels,df],axis=1) print('labels:\n',labels) |
成功