python 处理国家标准行业编码(编码·门类·大类·中类·小类)
进度
今天完整地进行了行业维度的清洗分析,把行业代码根据国家标准清洗出格式为 “编码·门类·大类·中类·小类” 的数据格式
过程
1、先把国家标准编码转化为json数据
2、根据原始数据编码逐层遍历json数据,补全缺失数据和问题数据。
代码
1 import pandas as pd
2 import xlwt
3 rank10="" #A
4 rank11="" #A的名字
5 rank20=""
6 rank21=""
7 rank30=""
8 rank31=""
9 rank40=""
10 rank41=""
11 finalstr=""
12 def std_excel():
13 # dict={"A":{"01":{"011":"谷物种植","0111":"稻谷种植"} ,
14 # "02":{"021":"林木育种和育苗","0211":"林木育种"}},
15 #
16 # "B":{"06":{ "0610":"烟煤和无烟煤开采洗选","0620":"褐煤开采洗选"},
17 # "07":{"0710":"石油开采","0720":"天然气开采"}}
18 # }
19
20 # layer1=dict['A']
21 # print("第一层 A:\n",layer1)
22 #
23 # layer2 = dict['A']['01']
24 # print("第二层 01农业:\n", layer2)
25 #
26 # layer3 = dict['A']['01']["011"]
27 # print("第三层 :\n", layer3)
28 #读取标准文件
29 df = pd.read_excel('GBT4754-2011.xlsx')
30 #首先寻找第一层大写字母层的数据 定位行loc[] 定位
31 # print(df.columns.values[0]) #A
32 my_dict={"A":{}}
33 new_dict={"A":
34 {"农、林、牧、渔业":
35 {"01":
36 {"农业":
37 {"001":
38 {"谷物种植":
39 {
40 "0111":"稻谷种植","0112":"小麦种植"
41 }
42 }
43 }
44 }
45 }
46 }
47 }
48 # new_dict["A"].update(
49 # {df.loc[0].values[0]:df.loc[0].values[1]}
50 # )
51 # print("excel表的行数:\n",len(df.index.values))
52 # print("测试字典:\n",new_dict)
53 # print(df.loc[80].values)
54 # print("一个单元格数据的数据类型:\n",type(df.loc[0].values[0]))
55
56 #测试完毕 开始构建行业领域分类字典
57 industry_json={}
58 #开始遍历表格 0 - 1423
59 for i in range(len(df.index.values)):
60 #由于表格的第一列数据被判定为int型 所以要转化成str
61 temp=df.loc[i].values
62 one = str(temp[0])
63 # print(len(one))
64 two = str(temp[1])
65 # print("数据格式:\n",type(temp[0]))
66 #通过判断values[0]的字符串的长度判断处于字典的哪一层 如果长度是1 那么在第一层门类 如果长度是2那么在第二层大类 如果长度是3那么在第三层中类
67 if(len(one)==1):
68 global rank10
69 global rank11
70 rank10=one
71 rank11=two
72 my_dict.update({rank10:{rank11:{}}})
73 if(len(one)==2):
74 global rank20
75 global rank21
76 rank20 = one
77 rank21 = two
78 my_dict[rank10][rank11].update({rank20:{rank21:{}}})
79 if (len(one) == 3):
80 global rank30
81 global rank31
82 rank30 = one
83 rank31 = two
84 my_dict[rank10][rank11][rank20][rank21].update({rank30:{rank31:{}}})
85 #这里做了代码的前三位字符串切分,为了判断一下有没有小类跳过中类的情况,需要直接跨过中类存储,少了一层字典{}
86 if (len(one) == 4):
87 global rank40
88 global rank41
89 rank40 = one
90 rank41 = two
91 divide_rank40=rank40[:3]
92 # print(divide_rank40,rank30)
93 if(divide_rank40==rank30):
94 # print("!!!!!~~~~~~~~~~~~")
95 my_dict[rank10][rank11][rank20][rank21][rank30][rank31].update({rank40:rank41})
96 else:
97 my_dict[rank10][rank11][rank20][rank21].update({rank40: rank41})
98 #得到最终的字典my_dict
99 # print(my_dict.keys())
100 # print(my_dict)
101 return my_dict
102 def is_excit(qb03):
103 global finalstr
104 #设置个标记,初始值False 说明默认找不到这个编码 如果找到了则设为 True 如果最终是False则重新分割字符串回调函数
105 flag = False
106 #获取字典
107 my_dict={}
108 my_dict.update(std_excel())
109 # print(my_dict)
110 #门类KEY
111 category=""
112 #大类
113 big_class=""
114 #中类
115 medium_class=""
116 #小类
117 small_class=""
118 # 遍历第一层 门类
119
120 for items in my_dict.items():
121 res = ""
122 for layer_0 in items[1].items():
123 # print("门类:\n",layer_0)
124 # print("门类名称:\n",layer_0[0])
125 category=layer_0[0]
126 """
127 --------------------------------------------------
128 """
129 # 遍历第二层大类
130 """
131 每进入一层遍历第一个for循环是进入一个这样格式的数据 ( 编码:{ } )
132 之后第二个for循环进入那个字典{ }
133 字典构建的方式是 上一层是key 下一层是对应的value 同时它作为下一层的key
134
135 """
136 #进入第一层(A:{ } )
137 for layer_10 in layer_0[1].items():
138 # print("大类编码(两位):\n",layer_10[0])
139 #进入A对应的{ }
140 for layer_11 in layer_10[1].items():
141 # print("大类:\n",layer_11)
142 big_class = layer_11[0]
143 # 自己调用自己补全缺失值
144 if(len(qb03)==2 and qb03==layer_10[0]):
145 print("缺失值补全:\n", finalstr)
146 flag=True
147 res = finalstr + "·" + category + "·" + big_class + "·" + big_class + "·" + big_class
148 # print(res)
149 return res
150 # print("大类名称:\n",big_class)
151 """
152 --------------------------------------------------
153 """
154 #进入大类(01,{ })
155 for layer_20 in layer_11[1].items():
156 #进入01对应的 { }
157 #判断第二层下一级的名称是三位还是四位,如果是三位那么是正常的中类划分,如果是四位,那么是跳过了中类划分到了小类
158 if(len(layer_20[0])==4):
159 small_class=layer_20[1]
160 # print("大类直接分到小类:\n",small_class)
161 #判断字符串
162 if(qb03==layer_20[0]):
163 print("跨过中类的小类,判断成功!",qb03)
164 flag=True
165 res = qb03+ "·"+ category + "·" + big_class + "·"+small_class+ "·"+small_class
166 return res
167 else:
168 #这个分支的意思是有的类别只到了大类,没有中类直接分到了四位数的小类,所以必须分开遍历,字符串不能按字典遍历
169 for layer_21 in layer_20[1].items():
170 # print("中类:\n",layer_21)
171 medium_class = layer_21[0]
172 # print("中类名称:\n",medium_class)
173 # 这里是个大坑,我的遍历是进入值的那一层,编码在上一级的遍历 layer_20[0]
174 if (qb03 == layer_20[0]):
175 print("三位中类判断成功!", qb03)
176 flag=True
177 res = qb03 + "·" + category + "·" + big_class + "·" + medium_class+ "·" + medium_class
178 return res
179 #继续划分到小类
180 for layer_30 in layer_21[1].items():
181 #这个layer_30就是最后一层的四位数数据了 格式: ('0111', '稻谷种植') 是一个tuple 索引0是编码1是名称
182 small_class=layer_30[1]
183 # print("小类名称:\n",small_class)
184 #--------------------------------------------------------------------------------
185 # 判断字符串
186 if (qb03 == layer_30[0]):
187 print("正常四位小类判断成功!", qb03)
188 flag=True
189 res=qb03+"·"+category+"·"+big_class+"·"+medium_class+"·"+small_class
190 return res
191 if(flag==False):
192 finalstr = qb03
193 new_qb03=qb03[:2]
194 return is_excit(new_qb03)
195 def clean():
196 """
197 1、读取源数据表格
198 2、逐个把数据传入is_exist()方法获得返回值存回excel表格
199 :return:
200 """
201 df=pd.read_excel("2013_year_data.xlsx")
202 # print(df.loc[0].values)
203 res=[]
204 temp_res=""
205 #range(len(df.index.values))
206 for i in range(len(df.index.values)):
207 # print(df.loc[i].values[0])
208 temp_res=is_excit(str(df.loc[i].values[0]))
209 print(temp_res)
210 if(temp_res!=None):
211 res.append(temp_res)
212 else:
213 res.append(str(df.loc[i].values[0]))
214 # print(res)
215 #把结果存储到excel表
216 workbook = xlwt.Workbook(encoding='utf-8')
217 sheet = workbook.add_sheet('sheet1', cell_overwrite_ok=True)
218 sheet.col(0).width=256*100
219 sheet.write(0, 0, "data")
220 for i in range(len(res)):
221 sheet.write(i+1, 0, res[i])
222 workbook.save('2013_res_data.xls')
223 return None
224 if __name__ == '__main__':
225 # print()
226 #311 2662 610
227 # res=is_excit("610")
228 # print("----------------------")
229 # print(res)
230 # print("----------------------")
231
232 clean()
部分json数据(格式)
1 {
2 'A': {
3 '农、林、牧、渔业': {
4 '01': {
5 '农业': {
6 '011': {
7 '谷物种植': {
8 '0111': '稻谷种植',
9 '0112': '小麦种植',
10 '0113': '玉米种植',
11 '0119': '其他谷物种植'
12 }
13 },
14 '012': {
15 '豆类、油料和薯类种植': {
16 '0121': '豆类种植',
17 '0122': '油料种植',
18 '0123': '薯类种植'
19 }
20 },
21 '013': {
22 '棉、麻、糖、烟草种植': {
23 '0131': '棉花种植',
24 '0132': '麻类种植',
25 '0133': '糖料种植',
26 '0134': '烟草种植'
27 }
28 },
29 '014': {
30 '蔬菜、食用菌及园艺作物种植': {
31 '0141': '蔬菜种植',
32 '0142': '食用菌种植',
33 '0143': '花卉种植',
34 '0149': '其他园艺作物种植'
35 }
36 },
37 '015': {
38 '水果种植': {
39 '0151': '仁果类和核果类水果种植',
40 '0152': '葡萄种植',
41 '0153': '柑橘类种植',
42 '0154': '香蕉等亚热带水果种植',
43 '0159': '其他水果种植'
44 }
45 },
46 '016': {
47 '坚果、含油果、香料和饮料作物种植': {
48 '0161': '坚果种植',
49 '0162': '含油果种植',
50 '0163': '香料作物种植',
51 '0169': '茶及其他饮料作物种植'
52 }
53 },
54 '0170': '中药材种植',
55 '0190': '其他农业'
56 }
57 },
58 '02': {
59 '林业': {
60 '021': {
61 '林木育种和育苗': {
62 '0211': '林木育种',
63 '0212': '林木育苗'
64 }
65 },
66 '0220': '造林和更新',
67 '0230': '森林经营和管护',
68 '024': {
69 '木材和竹材采运': {
70 '0241': '木材采运',
71 '0242': '竹材采运'
72 }
73 },
74 '025': {
75 '林产品采集': {
76 '0251': '木竹材林产品采集',
77 '0252': '非木竹材林产品采集'
78 }
79 }
80 }
81 },
完整版行业分类 关注订阅号【靠谱杨阅读人生】回复【行业】获取
python 处理国家标准行业编码(编码·门类·大类·中类·小类)的更多相关文章
- 小白的Python之路 day1 字符编码
字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Interc ...
- python之旅:字符编码
一 了解字符编码的知识储备 一 计算机基础知识 知识储备:cpu.内存.硬盘 二 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在 ...
- python进阶10 MySQL补充 编码、别名、视图、数据库修改
python进阶10 MySQL补充 编码.别名.视图.数据库修改 一.编码问题 #MySQL级别编码 #修改位置: /etc/mysql/mysql.conf.d/mysqld.cnf def ...
- python 3 学习字符串和编码
字符串和编码 阅读: 895464 字符编码 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字 ...
- python(10)- 字符编码
一 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为“明文”(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英 ...
- python基础——6(字符编码,文件操作)
今日内容: 1.字符编码: 人识别的语言与机器识别的语言转化的媒介 ***** 2.字符与字节: 字符占多少字节,字符串转化 *** 3.文件操作: 操作硬盘中的一块区域:读写操作 ...
- python(4)- 字符编码
一 什么是编码? 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为“明文”(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英 ...
- python文件操作:字符编码与文件处理
一.字符编码 二.文件处理 一.字符编码 储备知识点: 1. 计算机系统分为三层: 应用程序 操作系统 计算机硬件 2. 运行python程序的三个步骤 1. 先启动python解释器 2. 再将py ...
- python 2和3 字符编码
在字符编码问题上,python2 和python3 还是有点不同的.今日写篇博客,彻底理清这个问题.. 字符编码问题的由来: 这要从计算发展历史来看待这个问题了,一开始,歪果仁使用ASCII码,8位( ...
- Python基础之字符串和编码
字符串和编码 字符串也是一种数据类型,但是字符串比较特殊的是还有个编码问题. 因为计算机自能处理数字,如果徐娅处理文本,就必须先把文本转换为数字才能处理,最早的计算机子设计时候采用8个比特(bit)作 ...
随机推荐
- Java I/O 教程(九) FileWriter和FileReader
FileWriter Java FileWriter 用于往文件中写入字符数据. 不像FileOutputStream类,你无需转换字符串成字节数组,因为它提供了直接写字符串的方法. 类定义 publ ...
- 详解SSL证书系列(1)什么是SSL证书?
你一定遇到过这种情况,打开一个网站,浏览器弹出警告"您与此网站之间建立的连接不安全.由于此连接不安全,因此信息(如密码或信用卡)不会安全地发送到此网站,并且可能被其他人截获或看到" ...
- pyqt5学习示例
python代码编写pyqt5 主窗口的类型:有三种窗口 # 相关函数方法 setWindowTitle() # 设置主窗口的标题 resize() # 设置窗口的大小 statusBar() # 创 ...
- 【Azure 事件中心】适用Mirror Maker生产数据发送到Azure Event Hub出现发送一段时间后Timeout Exception: Expiring 18 record(s) for xxxxxxx: 79823 ms has passed since last append
问题描述 根据"将 Apache Kafka MirrorMaker 与事件中心配合使用"一文,成功配置了Mirror Maker来发送数据到Event Hub中.为什么只能成功运 ...
- win上vscode配置ffmpeg
参考博客https://blog.csdn.net/leixiaohua1020/article/details/38868499 https://blog.csdn.net/weixin_37515 ...
- 三: MySQL的数据目录
# MySQL的数据目录 1. MySQL8的主要目录结构 1.1 数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ MySQL服务器程序在启动时会到文件系统的某个 ...
- Codeforces Round 303 (Div. 2)C. Kefa and Park(DFS、实现)
@ 目录 题面 链接 题意 题解 代码 总结 题面 链接 C. Kefa and Park 题意 求叶节点数量,叶节点满足,从根节点到叶节点的路径上最长连续1的长度小于m 题解 这道题目主要是实现,当 ...
- linux 前端 jenkins打包失败 permission 权限安装 root 安装nodejs,没有权限,另一个账号,需要chmod将文件权限打开
linux 前端 jenkins打包失败 permission 权限安装 root 安装nodejs,没有权限,另一个账号,需要chmod将文件权限打开 开始以为nodejs版本问题 最后发现是安装n ...
- 词根 ten 展开 持有 /tin/tent/tain “to hold”
词根 ten 展开 持有 /tin/tent/tain "to hold" 记忆方式:en是拿出.忘了从哪里看的了.t是动作过去. 如果是 过去的时候已经拿出来,那就是 展开 延展 ...
- 线上机器 swap 过高导致告警
哈喽大家好,我是咸鱼. 今天收到了一个告警,说有台服务器上的 swap 过高,已经用了 50% 以上了. 登录机器查看一下内存以及 swap 的使用情况. [root@localhost ~]# fr ...