日常工作的报表数据库字段超多,来源不一,很多时候不能一次更新完整字段,避免不了一次又一次的vlookup,v过之后还是存在缺失值和准确性判断,人生苦短,我用Python。分享一下我更新自己部分数据库的代码,涉及合并多张表格,统一字段名称和格式,增删列名,多表关联,vlookup后的缺失字段处理。

import pandas as pd
import numpy as np
import time


#读入基本数据
df_zx=pd.read_excel('F:\\刷数据字段库\\ProjectParameter-淮南-1228.xlsx',)
df_hw=pd.read_excel('F:\\刷数据字段库\\寿县工参LTE.xlsx')
df_bd=pd.read_excel('F:\\刷数据字段库\\4G维护小区_20181229.xlsx')

'''
处理中兴数据
'''
df_01=df_zx.copy()
df_01.drop([0,1],inplace=True)
#默认参数axis=0,表示对行进行操作,如需对列进行操作需要更改默认参数为axis=1,
#df1.drop(columns=["handsome","smart"]),df.drop(["列名"],axis=1)
df_01.rename(columns={'小区名称\nuserLabel\nstring[0..128]':'小区名称'},inplace = True)
df_01.rename(columns={'eNodeB标识\neNodeB ID\nlong:[0..1048575]':'eNodeB ID'},inplace = True)
df_01.rename(columns={'小区标识\ncellLocalId\ninteger:[0~255]':'CI'},inplace = True)
df_01.rename(columns={'跟踪区码\nTAC\nlong:[0..65535]':'TAC'},inplace = True)
df_01.rename(columns={'物理小区识别码\nPCI\nlong:[0..503]':'PCI'},inplace = True)
df_01.rename(columns={'小区上行系统频域带宽\nbandWidthUl\nlong:[0..5]\n0:1.4(6RB),\n1:3(15RB),\n2:5(25RB),\n3:10(50RB),\n4:15(75RB),\n5:20(100RB)\nOnly for FDD':'带宽'},inplace = True)
df_01.rename(columns={'下行链路的中心载频\nearfcnDl\ndouble Step:0.1 \nUnite:MHz':'下行链路的中心载频'},inplace = True)
df_01.rename(columns={'上行链路的中心载频\nearfcnDl\ndouble Step:0.1 \nUnit:MHz\nOnly for FDD':'上行链路的中心载频'},inplace = True)
df_02=df_01[['小区名称','eNodeB ID','CI','TAC','PCI','带宽','下行链路的中心载频','上行链路的中心载频']]
#更改列名和筛选需要的数据
col_name = df_02.columns.tolist()
col_name.insert(col_name.index('带宽')+1,'带宽2') # 在 带宽 列后面插入
df_02=df_02.reindex(columns=col_name)
#在带宽后添加一列
df_02.loc[df_02['带宽']=='3','带宽2']='10'
df_02.loc[df_02['带宽']=='5','带宽2']='20'
df_02.loc[df_02['带宽']=='4','带宽2']='15'
df_02['带宽']=df_02['带宽2']
del df_02['带宽2']
#修改成相应带宽
df_03=df_02.reset_index().drop('index',axis=1)
df_03.columns=['Cell Name','eNodeB ID','Cell ID','TAC','PCI','DlBandwidth','DlEarfcn', 'UlEarfcn']
#df_03.columns.tolist()

'''
处理华为数据
'''
data_01=df_hw.copy()
data_01.columns.tolist()
data_01=data_01[['Cell Name','eNodeB ID','Cell ID','TAC','PCI','DlBandwidth','DlEarfcn', 'UlEarfcn']]
data_01['DlBandwidth']=data_01['DlBandwidth'].str[:-1]

'''
连接两个厂家的工参数据
'''
data_02=pd.concat([df_03,data_01],axis=0)
#制作key
col_name2=data_02.columns.tolist()
col_name2.insert(col_name2.index('Cell ID')+1,'cell label')
data_02=data_02.reindex(columns=col_name2)
#data_02['eNodeB ID'].astype('str')
#data_02['Cell ID'].astype('str')
data_02['cell label']='107.'+data_02['eNodeB ID'].astype('str')[0:]+'.'+data_02['Cell ID'].astype('str')[0:]




def f1(data,col):
    data[col+'_norm'].replace(np.nan,'a',inplace=True)
    #n=0
    for i in range(len(data)):
        if data[col+'_norm'][i]!='a':
            print('非空值为: %s'%(data[col+'_norm'][i]))
           # n+=1
            data[col][i]=data[col+'_norm'][i]
    return data

'''
更新PCI信息
'''
data_03=pd.merge(df_bd,data_02, left_on='小区标识',right_on='cell label',how='left')
col_name3=data_03.columns.tolist()
col_name3.insert(col_name3.index( '物理小区识别码')+1,'物理小区识别码_norm')
data_03=data_03.reindex(columns=col_name3)
data_03['物理小区识别码_norm']=data_03['PCI']
#data_03['物理小区识别码_norm'].replace(np.nan,'a',inplace=True)
f1(data_03,'物理小区识别码')
data_03['物理小区识别码列表']=data_03['物理小区识别码']
del data_03['物理小区识别码_norm']

'''
#检查有多少不同的点

data_04=data_03.copy()

def f2(data):
    for  i in range(len(data)):
        if data['跟踪区编码'][i]!=data['跟踪区列表'][i]:
            print('有不同值为:%i'%i)
f2(data_04)
'''


'''
更新tac
'''
data_03.rename(columns={'TAC':'跟踪区编码_norm'},inplace=True)
f1(data_03,'跟踪区编码')
data_03['跟踪区列表']=data_03['跟踪区编码']

'''
更新带宽
'''
data_03.rename(columns={'DlBandwidth':'下行带宽_norm'},inplace=True)
f1(data_03,'下行带宽')

'''
更新 'DlEarfcn'
'''
data_03.rename(columns={'DlEarfcn':'下行频点_norm'},inplace=True)
f1(data_03,'下行频点')


'''
更新'UlEarfcn'
'''
data_03.rename(columns={'UlEarfcn':'上行频点_norm'},inplace=True)
f1(data_03,'上行频点')



'''
选择需要的字段
'''
data_final=data_03[['小区别名',
 '小区标识',
 '小区网管名称',
 '省份',
 '所属城市',
 '所属区县',
 '乡镇',
 '所属eNodeB标识',
 '小区标识码',
 '所属扇区编号',
 '设备厂家EutranCell标识','设备厂家',
 '所属行政区域类型',
 '是否采集MR',
 '经度',
 '纬度',
 '天线数',
 '双工方式',
 '采用的cp类型',
 '子帧配置类型',
 '特殊子帧配置类型',
 '是否为RRU小区', '上行频点',
 '下行频点',
 '物理小区识别码',
 '物理小区识别码列表',
 '小区配置的载频发射功率',
 '参考信号(RS)的每RE平均发射功率',
 'A类符号上每RE平均功率与RS占用的RE平均功率的比值',
 'B类符号上每RE平均功率与RS占用的RE平均功率的比值',
 'A类符号功率比值',
 'B类符号功率比值',
 '广播信道功率',
 '最大传输功率','跟踪区编码',
 '跟踪区列表',
 '运行状态',
 '小区覆盖类型',
 '小区覆盖范围',
 'PLMN标识的列表',
 '小区MBMS开关',
 '频段指示',
 '中心载频的信道号',
 '带宽',
 '下行循环前缀长度',
 '上行循环前缀长度',
 '上行带宽',
 '下行带宽', '小区激活状态',
 '高速小区指示',
 '发送和接收模式',
 '工作模式',
 '前导格式',
 '小区是否闭塞',
 '是否为省际边界小区',
 '省际边界小区相邻省份名称',
 'CSFB回落网络优先级',
 '是否高铁二层小区',
 '是否电信共享小区','建站单位',
 '共享方式',
 '是否载波聚合小区',
 '载波聚合类型',
 '载波聚合频段组合',
 '主载波小区CELL ID',
 '天线方向角',
 '天线挂高',
 '电子下倾角',
 '机械倾角',
 '入网时间',
 '架设类型']]
data_final['入网时间'].to
writer = pd.ExcelWriter('F:\\刷数据字段库\\4G维护小区_20181229_处理后.xlsx')
data_final.to_excel(writer,'sheet1',index=False)
writer.save()

需要练习的小伙伴可以加微信:zhengxiaoxuechase,备注需要代码的文件。

01-17 11:02