中国姓氏排行研究

1、数据清洗、整合

源数据

image

查看数据,数据清洗

# 查看数据,数据清洗

import os
os.chdir('C:/Users/Hjx/Desktop/项目09中国姓氏排行研究/')
# 创建工作路径

df01 = pd.read_csv('data01.csv',encoding = 'utf-8')
df02 = pd.read_csv('data02.csv',encoding = 'utf-8')
df_city = pd.read_excel('中国行政代码对照表.xlsx')
# 读取数据

df = pd.concat([df01,df02])
df = pd.merge(df,df_city,left_on='户籍地城市编号',right_on = '行政编码')  
df['工作地'] = df['工作地'].str[:15]   # 只提取工作地前15个字符即可
del df['行政编码']
del df['户籍地城市编号']
# 合并数据,添加经纬度字段
# 删除无用字段

print('读取数据共%i条' % len(df))
df.head(20)

数据整理

# 分别提取“工作地”中的省、市、区县
# 新建字段“工作地-省”,“工作地-市”,“工作地-区县”,如果数据中“工作地”字段无法提取省和市,则用“未识别”填充单元格
# *通过查看识别后的单元格,如果字数超过5则为“未识别”

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)] = '未识别'
# 整理未识别单元格

df.columns = ['姓','工作地','户籍所在地_省','户籍所在地_市','户籍所在地_区县','户籍所在地_lng','户籍所在地_lat',
              '工作地_省','工作地_市','工作地_区县']
print('读取数据共%i条' % len(df))
# 数据整理
df.head(20)

2、查看姓氏“普遍指数”

将数据按照“姓”做统计,找到数量最多的TOP20

# 将数据按照“姓”做统计,找到数量最多的TOP10

name_count = df['姓'].value_counts()[:20]
result1_01 = pd.DataFrame({'count':name_count, 'count_pre':name_count/name_count.sum()})
# 筛选top20的姓氏,计数并计算占比
result1_01

image

bokeh出联动柱状图

# bokeh出联动柱状图

from bokeh.models import HoverTool
from bokeh.layouts import gridplot
# 导入模块
output_file("xingshipaihang.html")
name_lst = result1_01.index.tolist()
source = ColumnDataSource(result1_01)
# 创建ColumnDataSource数据

hover1 = HoverTool(tooltips=[("姓氏计数", "@count")])  # 设置标签显示内容
result1 = figure(plot_width=800, plot_height=250,x_range = name_lst,
                 title="中国姓氏TOP20 - 计数" ,
                 tools=[hover1,'reset,xwheel_zoom,pan'])   # 构建绘图空间
result1.vbar(x='index', top='count', source=source,width=0.9, alpha = 0.7,color = 'red')   
result1.ygrid.grid_line_dash = [6, 4]
result1.xgrid.grid_line_dash = [6, 4]
# 柱状图1





from math import pi
from bokeh.palettes import Category20c
from bokeh.transform import cumsum
top20=result1_01
top20['angle'] = result1_01['count_pre']* 2*pi
top20['color'] = Category20c[len(top20)]

result3 = figure(plot_height=350, title="Pie Chart", toolbar_location=None,
           tools="hover", tooltips="@index: @count_pre", x_range=(-0.5, 1.0))

result3.wedge(x=0, y=1, radius=0.4,
        start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
        line_color="white", fill_color='color', legend_field='index', source=top20)

result3.axis.axis_label=None
result3.axis.visible=False
result3.grid.grid_line_color = None




p = gridplot([[result1], [result3]])
# 组合图表
show(p)

image

查看“何”姓的全国分布

# 查看“何”姓的全国分布

data_he1 = df[df['姓'] == '何']
data_he2 = data_he1.groupby(['姓','户籍所在地_lng','户籍所在地_lat'])['户籍所在地_市'].count()
data_he2 = data_he2.reset_index()
writer = pd.ExcelWriter('E:\\Data_analysis\\Project\\03\\he2.xlsx')
data_he2.to_excel(writer,'sheet1',index=False)
writer.save()
# 导出数据

print('导出完成!')

使用excel3d查看分布

image

使用echart作图

image