1.数据来源:感谢知乎乎友倾情提供。(两百多万条)
2.工具:spyder+excel+qgis
第一步数清洗:
我们有两个excel文件,利用concat函数将二者合并。
df1=pd.read_csv('data01.csv',encoding='utf-8')
df2=pd.read_csv('data02.csv',encoding='utf-8')
df_city=pd.read_excel('中国行政代码对照表.xlsx')
df=pd.concat([df1,df2])
df=pd.merge(df,df_city,left_on='户籍地城市编号',right_on = '行政编码')
df['工作地']=df['工作地'].str[:20]
然后利用data里面的户籍地城市编号和中国城市代码对照表,将城市经纬度连接进数据中。接下来比较麻烦的地方就是分别提取提取“工作地”中的省、市。这里因为有些工作地中没有省或者市的信息,所以在具体处理的时候需要分情况。
df['工作地_省'] = df['工作地'].str.split('省').str[0]
#识别省
df['工作地_市'] = df['工作地'].str.split('省').str[1].str.split('市').str[0]
df['工作地_市'][df['工作地_省'].str.len() > 5] = df['工作地_省'].str.split('市').str[0]
#识别省市
df['工作地_区县'] = ''
df['工作地_区县'][(df['工作地_市'].str.len() < 5)&(df['工作地'].str.contains('区'))] = df['工作地'].str.split('市').str[1].str.split('区').str[0] + '区'
df['工作地_区县'][(df['工作地_市'].str.len() > 5)&(df['工作地'].str.contains('区'))] = df['工作地'].str.split('区').str[0] + '区'
df['工作地_区县'][(df['工作地_市'].str.len() < 5)&(df['工作地'].str.contains('县'))] = df['工作地'].str.split('市').str[1].str.split('县').str[0] + '县'
df['工作地_区县'][(df['工作地_市'].str.len() > 5)&(df['工作地'].str.contains('县'))] = df['工作地'].str.split('县').str[0] + '县'
# 识别区县
df['工作地_省'][df['工作地_省'].str.len() > 5] = '未识别'
df['工作地_市'][df['工作地_市'].str.len() > 5] = '未识别'
df['工作地_区县'][(df['工作地_区县'].str.len() > 5) | (df['工作地_区县'].str.len() < 2)] = '未识别'
# 标记未识别单元格
解释一下这里的基本处理的逻辑:首先提取省份信息。提取的结果是有省份的信息提取出来了,没有省份信息的全部保留到省份列了。这就导致后面提取市的信息的时候有两种情况。一种是省提取成功的则对str[1]进提取,一种是省份没有提取成功的要对省列进行提取。对区县的提取也是类似的思路。
完成预处理之后,我想先来了解一下,这个top10姓氏是不是如百家姓所言(赵钱孙李,周吴郑王)。对各个姓氏进行count。得到人数和占比的柱状图。
然后是谭姓分布热力图。
可以变换一下,空间柱状图
我们还可以利用不同的工作地和出生地来来了解一下姓氏迁移的动态情况。处理起来稍微有点麻烦。先要根据工作地查询到对应坐标。
首先我们要把谭氏数据分隔出来保存成excel文件。
data_tan = df[['姓','户籍所在地_lng','户籍所在地_lat','工作地_市','工作地_区县']][df['姓'] == '谭']
data_tan = data_tan[data_tan['工作地_市'] != '未识别']
data_tan = data_tan[data_tan['工作地_区县'] != '未识别']
data_tan.columns = ['familyname','birth_lng','birth_lat','work_city','work_district']
writer = pd.ExcelWriter('C:\\Users\\Atan\\Desktop\\practice\\tan.xlsx')
data_tan.to_excel(writer,'sheet1',index=False)
writer.save()
然后比较麻烦的地方就来了,要根据工作地址得到对应的经纬度。这里推荐一个小工具geocoding,可以方便的得到经纬度。
最后我们将数据汇总得到两个经纬度,并转成csv格式。
然后就要做空间分析了,我用的QGIS软件。当然也可以用别的。
两次加载保存的csv格式数据并分别保存成对应的图层信息。利用插件得到连线图。稍微调整一下颜色,最后结果如下。