数据处理笔记5:循环读取excel中的各sheet

因为需要读取和处理的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)

成功

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值