记录一下实际操作的过程。通过实际应用初步感受Python的强大与方便。
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 3 11:21:31 2019
@author: User
数据来源格式:
主数据表 a613_zylr.csv:
包含列: mc,dzm_old12,lr,zylb (单位名称这个可以不要,原地址码,利润,专业类别)
行政区划变更表 dict_dzmcode_old2new.csv:
包含列: dzm_old12,dzm_new9 (长度为12的原地址码,长度为9的新地址码)
专业类别表 dict_zylb.csv:
zylb,zyname (专业代码,专业名称)
新的区划代码与区划名称对应表,目的是在统计表中显示区划中文名称,便于阅读
dict_dzm_chged.csv:
列名称:name, dzm_new_ang (区划中文名称,9位地址码)
目的:
“主数据表”中,部分单位的12位dzm被调整,现在为调整前的dzm。
需要根据主数据表中的12位dzm,确定该单位的调整后的9位地址码。
然后根据修改后的地址码进行汇总。
"""
import sys
import numpy as np
import pandas as pd
print('\n 1、读取分专业利润表------------------------:')
'''
包含列: mc,dzm_old12,lr,zylb (单位名称这个可以不要,原地址码,利润,专业类别)
'''
df_a613=pd.read_csv(u'data\\a613_zylr.csv',encoding = "gbk")
print(df_a613.head())
#print(df_a613.info())
print('\n 2、读取行政区划变更表------------------------:')
'''
包含列: dzm_old12,dzm_new9 (长度为12的原地址码,长度为9的新地址码)
'''
df_dzmcode_old2new=pd.read_csv(u'data\\dict_dzmcode_old2new.csv',encoding = "gbk")
df_dzmcode_old2new['dzm_old12']=df_dzmcode_old2new['dzm_old12'].astype(np.str_).str[0:12] # 转换为字符形式
df_dzmcode_old2new['dzm_new9']=df_dzmcode_old2new['dzm_new9'].astype(np.str_).str[0:9] # 转换为字符形式
print(df_dzmcode_old2new.head())
#print(area_chg.info())
print('\n 3、区划变更表转成字典------------------------:')
'''
区划变更表转成字典后,不用循环即可快速定位原代码与新代码的对应
'''
dict_area_chg=df_dzmcode_old2new.set_index('dzm_old12').T.to_dict('series') # dict records series index
#sys.exit()
print('\n 4、区划代码转换为文本:')
df_a613['dzm_old12']=df_a613['dzm_old12'].astype(np.str_)
print('\n 5、df_a613数据框生成新的区划码------------------------:')
'''
df_a613新建一列 dzm_new_ang(新地址码,9位),赋值规则:
12位原地址码如果在区域变更字典中,则使用字典中的对应键值,
否则使用原地址码前9位
'''
def ff(x):
if x['dzm_old12'] in dict_area_chg:
# return 1
return dict_area_chg[x['dzm_old12']][0] # 此处[0]与前面 to_dict('series') 有关系
else:
# return 0
return x['dzm_old12'][0:9]
rr = df_a613.apply(lambda x: ff(x), axis=1)
df_a613["dzm_new_ang"] = rr
#print(df_a613.head())
#sys.exit()
print('\n 6、df_a613数据框新生成一列地址码 dzm_new_an (新地址码,6位)----------:')
df_a613['dzm_new_an']=df_a613['dzm_new_ang'].str[0:6]
#print(df_a613.head())
#print('\n 7、df_a613 数据框新生成一列到乡镇的区划代码 dzm_ang----------:')
#df_a613['dzm_ang']=df_a613['dzm_new'].str[0:9]
#print(df_a613.head())
#print(lr.info())
#sys.exit()
print('\n 8、读取专业类别字典------------------------:')
df_zylb=pd.read_csv(u'data\\dict_zylb.csv',encoding = "gbk")
#print(dict_zylb.head())
print("\n 9、合并主表利润表:df_a613 与 专业类别数据框:df_zylb")
df_a613_1=pd.merge(df_a613,df_zylb,how='left',on='zylb')
#df_zylb1=pd.merge(df_a613_1,area_name_chged,on='dzm_ang')
#print(df_zylb.head())
#sys.exit()
print('\n 4、读取新的区划代码与区划名称对应表------------------------:')
'''
目的是在统计表中显示区划中文名称,便于阅读
dict_dzm_chged.csv文件,列名称:name, dzm_new_ang (区划中文名称,9位地址码)
'''
df_dzm_chged=pd.read_csv(u'data\\dict_dzm_chged.csv',encoding = "gbk")
#df_dzm_chged['dzm_new_ang']=df_dzm_chged['dzm_new9'].astype(np.str_).str[0:9] # 转换为字符形式
df_dzm_chged[['dzm_new_ang']]=df_dzm_chged[['dzm_new_ang']].astype(np.str_)
print(df_dzm_chged.head())
print('\n 10、分组汇总 利润(lr):')
#lr_group=lr.groupby(lr['area_an'])
#print(lr_group['lr','zylb'].agg('sum'))
#print(pd.pivot_table(df_a613,
# index=['area_an'],
# columns=['zylb'], # zylb zyname
# values=['lr'],
# aggfunc=[sum],
# fill_value=0,
# margins=True #不同维度汇总数
# ))
crosstb=pd.crosstab(df_a613_1['dzm_new_ang'], # dzm_new_an dzm_new_ang name
df_a613_1['zyname'], # zylb zyname
values=df_a613_1['lr'],
aggfunc=[sum,len,max,min,np.average],
margins=True #不同维度汇总数
)
#print(crosstb)
#sys.exit()
crosstb2=pd.merge(df_dzm_chged,crosstb,left_on='dzm_new_ang',right_on='dzm_new_ang',how='outer')
crosstb2.to_excel('data\out_cross.xlsx')
print('ok')
运行后保存为excel文件: