最近想到以前的一个面试题,是关于从某个网站采集表格,然后用pandas处理成指定的格式,当时看了完全是不知如何着手,现在用了一些时间,终于把这题给解决了,虽然耗时不少,还是挺有成就感的。下面就分享下个人的处理方式:
采集的表格样式

对方要求处理后的样式

爬取下载表格的方式这里就不做赘述了,毕竟这部分代码大同小异,着重分享下处理表格的代码:

# 先导入需要的包
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import random
import numpy as np
import re
import calendar
import datetime
import os
os.chdir(r'D:\CDA\File')
# 考虑带有数字的行对应英文的描述,故做个英文判断
def is_english(keyword): # 判断是否为全英文,是返回Truereturn all(ord(c) < 128 for c in keyword)def add_str(data_,n):  # 当数字行对应英文描述时,不确定向上找几行才是日文名称,故用个向上查找方式进行h=''for e in data_.iloc[n-1::-1,0]:if is_english(e[:3]):h=e+helse:h=e+':'+hbreakreturn hdef item(data,k):    # 对有数据的行进行名称是否为英文的判断,一般都是先日文,再英文描述。把一种产品的日文、英文捆在一起,中间用:隔开a=[]for j in data.iloc[k:,0]:if type(j)==str:if not is_english(j[:3]):b=j+':'a.append(b)if len(a)>1:del bbreakelse:try:bexcept:b=add_str(data,k)a.append(b)b=b+jelse:b=b+jz=b.replace(' ','').replace('\n','')return zdef isfloat(x):    # 判断产品日文、英文描述的几行是否有数据,有则返回True,最终可被执行处理if pd.isna(x):return Falsetry:float(x)except:return Falseelse:return Truedef get_all_lines(row_df):       # 先将品目(含日文、英文描述,生成单位)及数值清洗为标准格式all_line=[]for i,row in row_df.iterrows():if isfloat(row[3]):    # 金额line=':'.join([item(row_df,i),'生産(P):金額(百万円):(millionyen)']),row[3]all_line.append(line)if isfloat(row[2]):   # 数量quantity = row_df.iloc[i+1,1]quantity = quantity if pd.notnull(quantity) else f'({row[1]})'if re.search('千.+',row[1]) == None:     # 对方要求的格式中涉及到数量单位都要求化大至千,而有些产品单位需要进行转换        quantity='(10³'+f'{row[1]})'row[1]='千'+row[1]row[2]=int(row[2]/pow(10,3))line=':'.join([item(row_df,i),'生産(P)',f'数量({row[1]})',f'Quantity{quantity}']),row[2]all_line.append(line)return all_linedef last_day(date):    # 得到对方要求格式中的日期,表格中获取year=date.yearmonth=date.monthx,y = calendar.monthrange(year,month) # 得到当年当月第一天所处的星期数,及最后一天final_date=datetime.date(year=year,month=month,day=y)return final_date# 下载文件,通过爬虫代码下载的表格
file_name=data_file() # 解析文件
df=pd.read_excel(file_name,sheet_name='電子部品',header=None)
df1=df.iloc[:,:4]   # 获取第一段产品数据
df1.columns=['品目','单位','数量','金额']
df2=df.iloc[:,5:9]   # 获取第二段产品数据
df2.columns=['品目','单位','数量','金额']df_=pd.concat([df1,df2],ignore_index=True)  # 两端拼凑为一段
df_.dropna(how='all',inplace=True)  # 去除全为空的记录
df_.reset_index(drop=True,inplace= True)  # 原表格上重置索引all_lines=get_all_lines(df_)  # 执行前面的函数,将品目及数值处理成标准格式
row_date = df.iloc[0,5]
use_date = last_day(row_date)   # 执行前面函数,处理日期result_df=pd.DataFrame(all_lines,columns=["品目","值"])
result_df["时间"]=use_date
result_df=result_df.reindex(columns=["品目", "时间", "值"])   # 整理成最终版本,及对方需要的格式
save_name = 'doc'+os.path.sep+"电子部品整理后_" + file_name.split('\\')[-1]result_df.to_excel(save_name,index=False)  # 存为标准格式文件

利用pandas处理复杂表格相关推荐

  1. c语言读取excel表格_利用pandas处理excel表格

    这不是一篇详细介绍pandas的文章,只是我在利用python处理excel表格时找到的一些临时方案,为了避免忘记,记录在这里,也可能对你有帮助. pandas在对excel处理上使用的是xlrd和x ...

  2. python利用pandas合并excel表格代码_利用Python pandas对Excel进行合并的方法示例

    前言 在网上找了很多Python处理Excel的方法和代码,都不是很尽人意,所以自己综合网上各位大佬的方法,自己进行了优化,具体的代码如下. 博主也是新手一枚,代码肯定有很多需要优化的地方,欢迎各位大 ...

  3. pandas爬取表格数据

    利用pandas 方法: 1.soup = BeautifulSoup(html.content, 'lxml', from_encoding='utf-8') 2.pd.read_html() 请求 ...

  4. Python之Pandas:利用Pandas函数实现对表格文件的查之高级查询(类似sql,分组查询等)之详细攻略

    Python之Pandas:利用Pandas函数实现对表格文件的查之高级查询(类似sql,分组查询等)之详细攻略 目录 利用Pandas函数实现对表格文件的查之高级查询(类似sql) 1.分组查询

  5. 【利用python+pandas 拆分excel表格】

    利用python拆分excel表格 我们常常会遇到一个表格中包含各种类型的数据,想要把表格按照不同类型拆分到多个工作簿,使用python几行代码就可以轻松搞定 首先是安装需要的包 先cmd命令行安装下 ...

  6. 利用python模块pandas获取网页表格,并保存为excel

    文章只用于学习交流 利用python模块pandas获取网页表格. 网页上的表格内容,想要保存下来,有没有办法呢?答案是有的. 主要有两个步骤, 一是读取表格内容, 二是保存读取后的内容. 在这里只讲 ...

  7. python处理excel表格-Python利用pandas处理Excel数据的应用

    最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做自动化测试的时候,如果涉及到数据的读取和存储,那么而利用p ...

  8. 利用pandas读写HDF5文件

    一.简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个H ...

  9. 利用python处理excel表格

    利用python处理excel表格 注意事项:在excel打开状态下无法进行写入和保存,但是可以读取. 1.excel的两种格式(xlsx,xls) 建议使用xlsx,遇到xls统统都用pandas转 ...

最新文章

  1. linux 内存管理slab源码,Linux内核源代码情景分析-内存管理之slab-回收
  2. YBTOJ:红与蓝(博弈论)
  3. 商家自述:今年双11,我们更难了
  4. 给PhotoShop安装Portraiture插件
  5. 045 Android Studio 常用应用
  6. 省市县三级联动多种实现方式
  7. AIRIOT答疑第3期|如何使用物联网平台的可视化组态引擎?
  8. 【CSS练习】IT修真院--练习6-护工列表界面
  9. 工作4年从美团、陌陌、百度、阿里面试回来感想
  10. mysql无法退出命令行
  11. BUUCTF misc 专题(72)喵喵喵
  12. 阿里P6员工月薪2万4, 被女友嫌弃, 晒出女友月薪, 以为看错了
  13. 金融申请评分卡(3)
  14. 重磅!Pytorch宝典来了!
  15. maya! board_maya人物跑步动画制作中文教程
  16. konva实现图层跟随鼠标缩放或者根据中心位置缩放
  17. NPOI以文本流的方式导出多个EXCEL,打开其中文件报“Excel 已完成文件级验证和修复.....或丢弃”
  18. JavaScript __ 对象小记
  19. Postman异步请求
  20. 前端黑科技:美团网页首帧优化实践

热门文章

  1. 多个使用idm下载器的技巧和窍门.
  2. 利用python画雪花
  3. 【NOIP模拟赛】铁路运输
  4. 大学生网购调查问卷统计分析报告
  5. pdf转换成jpg图片的在线转换方法
  6. http综合练习-给openlab搭建网站
  7. linx下mysql
  8. 首次引入数字房产概念,三亚森林半岛将如何引领房地产数字化?
  9. Java jar包解压
  10. 进化:勒索软件的前世今生