利用Python进行MR栅格数据处理

时间:2022-07-22
本文章向大家介绍利用Python进行MR栅格数据处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

昨天用sql处理了MR栅格数据,今天研究下python如何实现

合并原始文件

合并多个原始csv文件可以参考这篇文章 利用Python批量合并csv

这里直接给出代码

import pandas as pd
import os

path = input('请输入文件夹路径: ')
files = os.listdir(path)
csv_list = []
for f in files:
    if os.path.splitext(f)[1] == '.csv':
        csv_list.append(path + '\' + f)
    else:
        pass
df = pd.read_csv(csv_list[0], low_memory=False, encoding='gbk', dtype = {'中心经度' : str, '中心纬度' : str})
for i in range(1, len(csv_list)):
    df_i = pd.read_csv(csv_list[i], low_memory=False, encoding='gbk', dtype = {'中心经度' : str, '中心纬度' : str})
    pieces = [df[:], df_i[:]]
    df = pd.concat(pieces).drop_duplicates()
df = df.iloc[:, [0,1,9,13,14,32,41]]  #想保留的列的编号。0为起点

pandas列转换

先定义空的dataframe

df2 = pd.DataFrame(columns=['栅格中心经纬度标记', 'RSRP覆盖率','栅格总采样点数']) 

合并列

df2['栅格中心经纬度标记'] = df.iloc[:,0] + '_' + df.iloc[:,1]

转换列

df 中RSRP<=-110占比字段为 str ,需要先转换为 float 再除以100,最后用1-该值得到RSRP覆盖率

df2['RSRP覆盖率'] = 1 - df['RSRP<=-110占比'].str.strip("%").astype(float)/100

拆分列

# 栅格内主服务小区CGI
cgilist = df.iloc[:,2].str.split(';',expand=True).iloc[:,0:15]
cgilist = cgilist.reindex(columns=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])
vec1 = ['小区'+str(i)+'ECGI' for i in range(1,16)]
cgilist.columns = vec1
# 栅格内主服务小区采样点数量
mrs = df.iloc[:,3].str.split(';',expand=True).iloc[:,0:15]
mrs = mrs.reindex(columns=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])
vec2 = ['小区'+str(i)+'采样点数量' for i in range(1,16)]
mrs.columns = vec2
# 栅格内主服务小区弱覆盖采样点数量
bad_mrs = df.iloc[:,4].str.split(';',expand=True).iloc[:,0:15]
bad_mrs = bad_mrs.reindex(columns=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])
vec3 = ['小区'+str(i)+'弱覆盖采样点数量' for i in range(1,16)]
bad_mrs.columns = vec3
# 栅格内主服务小区采样点(>-110)数量
good_mrs = df.iloc[:,3].str.split(';',expand=True).iloc[:,0:15].astype('int') - df.iloc[:,4].str.split(';',expand=True).iloc[:,0:15].astype('int')
good_mrs = good_mrs.reindex(columns=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])
vec4 = ['小区'+str(i)+'采样点(>-110)数量' for i in range(1,16)]
good_mrs.columns = vec4

合并拆分好的列

df_split = pd.concat([pd.concat([cgilist, good_mrs],axis=1, join="inner"),mrs],axis=1, join="inner")

调整拆分列的顺序

vec=[['小区'+str(i)+'ECGI', '小区'+str(i)+'采样点(>-110)数量', '小区'+str(i)+'采样点数量'] for i in range(1,16)]
columnsname=[]
[columnsname.extend(vecx) for vecx in vec]
df_split = df_split[columnsname]

拼接所有列

mr_data = pd.concat([df2, df_split],axis=1, join="inner")

至此即可得到最终结果

写入文件至父级目录

mr_data.to_csv(path +r'..csv_merge.csv', index=None, encoding='gbk')