日常工作的报表数据库字段超多,来源不一,很多时候不能一次更新完整字段,避免不了一次又一次的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,备注需要代码的文件。