Python笔记:用crosstab生成分地区分专业利润统计表(df转为字典、df合并、lambda、crosstab)

    记录一下实际操作的过程。通过实际应用初步感受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文件:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值