让pandas狠狠的玩转excel

闲来无事,开始总结自己最近学过做过的东西。想想,数据才是所有网络和编程的核心,包括人工智能。但是自己的数据处理能力,仅仅停留在excel基础,只用代码完成过64个表格的批量筛选和提取。
后来阅读和搜索发现,Python里面处理数据,pandas和numpy才是王道。所以最近开始想办法学习这两个东西。
怎么学?看代码,看书,太枯燥。买课又不想花钱。经过研究发现,pandas是可以处理类似excel结构的各种数据的。包括最近我研究的sqlit3。上一篇博客刚研究过一点,附文章链接如下:https://blog.csdn.net/hq606/article/details/105545719

pandas在保存爬虫数据到excel时候用过几次。所以、我的思路是,趁着有感觉,把做过的excel提取数据的代码,全部替换为pandas。这样就感觉目标很强烈,好奇心膨胀,一刻不耽误,看看我十几天写的代码,用pandas能不能很快替换出来,而且代码量尽量少,那样就会很有意思,越想越兴奋。没想到一上午就达到原来的效果啦。验证了pandas确实提取和处理数据是很好用的。比起excel相关的库,好用多了。
pandas侧重于提取,清洗,分析。excel相关的库,侧重于写入,格式修改。
接下来放上代码,便于以后复习查看。写的比较乱,完全是堆砌的,一边百度一边堆砌上去。

有缘看到我的文章的话,欢迎各种吐槽,狠狠地批评,指出问题,让我继续学习提高。

import pandas as pd
import numpy as np
import 正则条件 #自己写的匹配函数用的正则,做了一个小函数
from openpyxl import load_workbook,Workbook
import is_contain_chinese #这个是判断数据是否包含汉字
def read_excel1(path):#函数 提取所有sheet名字
    data_xls = pd.ExcelFile(path)
    #print(data_xls.sheet_names)
    #print(name)
    return data_xls.sheet_names
def pddata(path,k):#主函数 path文件路径 K是sheet名的序号 读取表格筛选数据
    global xx,rows,dfdata,out
    read_excel1(path)
    rows=pd.read_excel(path, sheet_name=read_excel1(path)[k]) 
    labels = list(rows.columns.values) #为了得到表格的表头名称,df不会输出这个东西
    #print(rows)
    aa=pd.DataFrame(rows) 

    dfdata=[]
    x=np.array(rows.loc[:])#这里是把读取的全部 数据转为array  便于遍历
    xx=pd.DataFrame(x)#转成一个df对象,万一用的着,里面有个次标题要用它提取
    y=x.tolist()#把array转为列表的方法记录一下用法而已,不是重点
    n=0  #用来记录遍历到哪一行                    
    for i in np.array(rows.loc[:]):#开始遍历
        n+=1
        for j in i:

            aa,bb=正则条件.stloc(str(j))            
        
            if  3196 <= int(aa) <= 9060 or 3196 <= int(bb) <= 9060:
                dfdata.append(i)
                print(n)
    #xx.drop(labels=[m],axis=0,inplace=True) #删除行的方法,仅仅记录一下方法  
    #bb=pd.DataFrame(dfdata)
    print('*****************************************************')
    #print(pd.DataFrame([rows.columns.values]))
    #print(xx[:2])
    #print(pd.DataFrame(dfdata))
    title0=pd.DataFrame([rows.columns.values])   #表头文字名称
    title1=xx[:2]     #次级表头名称
    content=pd.DataFrame(dfdata)  #表格里面提取到的数据内容
    out=pd.concat([title0,title1,content])#这个有用,把三个df对象拼接起来,便于一次性写入excel
    print(read_excel1(path)[k])  #显示本次循环的sheet名
    print(out)
    return out# 把拼接好的df对象返回给函数

if __name__ == '__main__':

    path='汇总.xlsx'# 需要提取的文件
    read_excel1(path) #读取文件得到sheetnames
    
    wb =Workbook()
    wb.save('output.xlsx')#生成一个文件作为要输出的文件

    for k in range(len(read_excel1(path))):#开始遍历每一个sheet 正则匹配提取数据
    #for k in range(1):     #这一句是测试用的,只读取第一个sheet 试试效果
        writer=pd.ExcelWriter('output.xlsx', engine='openpyxl')  #用openpyxl是为了避免循环的时候sheet写入总是被覆盖的问题,单次不会覆盖,循环就会出现,不明白原因,反正这样可以写入,不会被覆盖。
        book = load_workbook('output.xlsx')
        writer.book = book
        data3 = pddata(path,k) #这个是重点筛选数据的主要函数方法**
        data3.to_excel(writer,sheet_name=read_excel1(path)[k],index=False) #把out传入excel保存
        writer.save()


数据和图片就不放了,不能泄露数据啊。
就是64个工作表,需要提取符合条件的数据,整行取出来

附上我的正则条件函数,完全是猜的

def stloc(ss):
    try:
        m2= re.findall('(?:K)\d+[+]\d+',ss)
        x2= re.findall('\d',m2[0])
        x3= re.findall('\d',m2[1])
        #print(m2[:])
        #print(''.join(x2[:]),''.join(x3[:]))
        knb1=int(''.join(x2[:]))
        knb2=int(''.join(x3[:]))
        print(str(knb1),str(knb2))
        
    except Exception as e:
        knb1=0
        knb2=0
        #print(e)
        pass
        print(knb1,knb2)
        #print('非数据格式')

    return knb1,knb2
    
ss='K26+158~K26+184'  #这个是需要被识别,转化的数据示例,用来测试函数的功能,然后用他锁定数据范围
a,b=stloc(ss)
print(a,b,'测试')

还有一个识别是否存在汉字的也放出来学习。代码是 我搜的。忘了那个地址了。要是涉及产权的,联系一下我,我及时删除,按理说就几行代码,估计没啥产权。而且是很容易搜索到的。

def is_contain_chinese(check_str):
    """
    判断字符串中是否包含中文
    :param check_str: {str} 需要检测的字符串
    :return: {bool} 包含返回True, 不包含返回False
    """
    for ch in check_str:
        if u'\u4e00' <= ch <= u'\u9fff':
            return True
    return False

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬码工琪老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值