用 Python 分析了 5 万条相亲数据,告诉你男女相亲背后的秘密


前言
本文利用 Python 分析了按城市寻找所有地区的征婚信息,看看相亲男女的画像。


import pandas as pdimport re
df = pd.read_excel('marriage.xlsx')df.head()

df.info()


# 获取34个省级行政区域,包括23个省,5个自治区,4个直辖市,2个特别行政区的名称with open('地区.txt', 'r', encoding='utf-8') as f:area = f.read().split('\n')print(area)print(len(area))
['北京', '上海', '天津', '重庆', '黑龙江', '吉林', '辽宁', '内蒙古', '河北', '新疆', '甘肃', '青海', '陕西', '宁夏', '河南', '山东', '山西', '安徽', '湖北', '湖南', '江苏', '四川', '贵州', '云南', '广西', '西藏', '浙江', '江西', '广东', '福建', '台湾', '海南', '香港', '澳门']34areas_list = []for i in df['居住地']:for j in area:if j in i:areas_list.append(j)breakelse:areas_list.append('未知')df['居住地'] = areas_listdf.head()

with open('学历.txt', 'r', encoding='utf-8') as fp:edu = fp.read().split('\n')print(edu)
['博士', '硕士', '本科', '大专', '中专', '高中', '初中', '小学']salary_list = []edu_list = []for item in df['学历/月薪']:if '元' in item: # 这一列的数据是表达月薪的话 计算data = re.findall('\d+', item)data = [int(x) for x in data]salary = int(sum(data) / len(data)) # 取整salary_list.append(salary)edu_list.append('未知')else:salary_list.append('未知')for e in edu:if e in item:edu_list.append(e)breakelse:edu_list.append('未知')print(len(edu_list))print(len(salary_list))df['学历'] = edu_listdf['月薪'] = salary_listdf.head()

del df['学历/月薪']df

df.to_excel('处理后数据.xlsx', index=False)

数据分析
# -*- coding: UTF-8 -*-"""@File :男女占比情况.py@Author :叶庭云@CSDN :https://yetingyun.blog.csdn.net/"""import pandas as pdimport collectionsfrom pyecharts.charts import Piefrom pyecharts import options as optsfrom pyecharts.globals import ThemeType, CurrentConfig# 引用本地js资源渲染CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'# 提取数据df = pd.read_excel('处理后数据.xlsx')gender = list(df['性别'])# 统计男女人数gender_count = collections.Counter(gender).most_common()gender_count = [(k, v) for k, v in gender_count]pie = Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))# 富文本效果 环图pie.add('性别', data_pair=gender_count, radius=["40%", "55%"],label_opts=opts.LabelOpts(position="outside",formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",background_color="#eee",border_color="#aaa",border_width=1,border_radius=4,rich={"a": {"color": "#999", "lineHeight": 22, "align": "center"},"abg": {"backgroundColor": "#e3e3e3","width": "100%","align": "right","height": 22,"borderRadius": [4, 4, 0, 0],},"hr": {"borderColor": "#aaa","width": "100%","borderWidth": 0.5,"height": 0,},"b": {"fontSize": 16, "lineHeight": 33},"per": {"color": "#eee","backgroundColor": "#334455","padding": [2, 4],"borderRadius": 2,},},),)pie.set_global_opts(title_opts=opts.TitleOpts(title='相亲男女占比情况'))pie.set_colors(['red', 'blue']) # 设置颜色pie.render('男女占比情况.html')

# -*- coding: UTF-8 -*-"""@File :年龄分布.py@Author :叶庭云@CSDN :https://yetingyun.blog.csdn.net/"""import pandas as pdimport collectionsfrom pyecharts.charts import Barfrom pyecharts.globals import ThemeType, CurrentConfigfrom pyecharts import options as optsCurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'df = pd.read_excel('处理后数据.xlsx')age = list(df['年龄'])age_count = collections.Counter(age).most_common()# 按年龄排序age_count.sort(key=lambda x: x[0])age = [x[0] for x in age_count]nums = [y[1] for y in age_count]# print(age_count)bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS))bar.add_xaxis(age)bar.add_yaxis('人数', nums) # 数据多的时候设置不显示标签bar.set_global_opts(title_opts=opts.TitleOpts(title='相亲男女年龄分布'))# 标记最大值 最小值 平均值 标记平均线bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),opts.MarkPointItem(type_="min", name="最小值"),opts.MarkPointItem(type_="average", name="平均值")]),markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值")]))bar.render('年龄分布.html')

31 岁的相亲男女人数最多,有 2637 人,各个年龄段都有一定数量的人,我们将年龄小于等于 20 岁,大于等于 70 岁的相亲男女数据单独提取出来看看。
import pandas as pddf = pd.read_excel('处理后数据.xlsx')df1 = df[df['年龄'] <= 20]df2 = df1['婚况'].value_counts() # 统计小于等于20岁的相亲男女的婚况print(df2)结果如下:未婚 153离异 6丧偶 2Name: 婚况, dtype: int64
import pandas as pddf = pd.read_excel('处理后数据.xlsx')df1 = df[df['年龄'] <= 20]df3 = df1[df1['婚况'] == '离异']print(df3)
网名 性别 ... 学历 月薪17425 微风轻起 男士 ... 未知 5000029645 媳妇 女士 ... 大专 未知30398 仙妹 女士 ... 高中 未知30485 会员1415395937 男士 ... 未知 3500036684 微笑着变老 女士 ... 高中 未知49864 风吹动了风玲 女士 ... 高中 未知[6 rows x 9 columns]

# -*- coding: UTF-8 -*-"""@File :男女占比情况.py@Author :叶庭云@CSDN :https://yetingyun.blog.csdn.net/"""import pandas as pdimport collectionsfrom pyecharts.charts import Piefrom pyecharts import options as optsfrom pyecharts.globals import ThemeType, CurrentConfig# 引用本地js资源渲染CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'# 提取数据 婚况不为未填写的df = pd.read_excel('处理后数据.xlsx')data = df[df['婚况'] != '未填写']# 统计各婚况相亲男女人数data_count = collections.Counter(data['婚况']).most_common()print(data)c = (Pie().add("婚况",data_count,radius=["40%", "55%"],label_opts=opts.LabelOpts(position="outside",formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",background_color="#eee",border_color="#aaa",border_width=1,border_radius=4,rich={"a": {"color": "#999", "lineHeight": 22, "align": "center"},"abg": {"backgroundColor": "#e3e3e3","width": "100%","align": "right","height": 22,"borderRadius": [4, 4, 0, 0],},"hr": {"borderColor": "#aaa","width": "100%","borderWidth": 0.5,"height": 0,},"b": {"fontSize": 16, "lineHeight": 33},"per": {"color": "#eee","backgroundColor": "#334455","padding": [2, 4],"borderRadius": 2,},},),).set_colors(["#8B008B", "#FF1493", "#000000"]).set_global_opts(title_opts=opts.TitleOpts(title="相亲男女婚况")).render("pie_rich_label.html"))

相亲男女婚况,离异的占比 57.67%,未婚占比 34.14%,丧偶占比 8.19%。
# -*- coding: UTF-8 -*-"""@File :学历分布.py@Author :叶庭云@CSDN :https://yetingyun.blog.csdn.net/"""import pandas as pdimport collectionsfrom pyecharts.charts import Piefrom pyecharts import options as optsfrom pyecharts.globals import CurrentConfig# 引用本地js资源渲染CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'# 提取数据 学历不为未知的df = pd.read_excel('处理后数据.xlsx')data = df[df['学历'] != '未知']# print(data)# 统计各学历层次相亲男女数量data_count = collections.Counter(data['学历']).most_common()c = (# 宽 高 背景颜色Pie(init_opts=opts.InitOpts(width="800px", height="500px", bg_color="#2c343c")).add(series_name="相亲男女学历", # 系列名称data_pair=data_count, # 系列数据项,格式为 [(key1, value1), (key2, value2)...]rosetype="radius", # radius:扇区圆心角展现数据的百分比,半径展现数据的大小radius="55%", # 饼图的半径center=["50%", "50%"], # 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标label_opts=opts.LabelOpts(is_show=False, position="center"), # 标签配置项).set_colors(["#00BFFF", "#00FF7F", "#FF1493", "#8B008B", "#FFFF00", "#556B2F"]).set_global_opts(title_opts=opts.TitleOpts(title="相亲男女学历",pos_left="center",pos_top="20",title_textstyle_opts=opts.TextStyleOpts(color="#fff"),),legend_opts=opts.LegendOpts(is_show=False),).set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)" # 'item': 数据项图形触发,主要在散点图,饼图等无类目轴的图表中使用),label_opts=opts.LabelOpts(color="#fff"),).render("相亲男女学历.html"))

相亲男女学历大部分在高中(35.92%)、大专(24.72%),有近六成的相亲男女,本科占比 20.7%,中专占比 16.35%,硕士、博士高学历的相亲男女人数较少,分别占比 2.14%,0.17%。
# -*- coding: UTF-8 -*-"""@File :地区分布.py@Author :叶庭云@CSDN :https://yetingyun.blog.csdn.net/"""import pandas as pdimport collectionsfrom pyecharts import options as optsfrom pyecharts.charts import Geofrom pyecharts.globals import ChartTypefrom pyecharts.globals import ThemeType, CurrentConfigCurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'df = pd.read_excel('处理后数据.xlsx')area = list(df['居住地'])area_count = collections.Counter(area).most_common(34)print(area_count)# 初始化配置项 背景颜色 大小 主题geo = Geo(init_opts=opts.InitOpts(width='1000px', height='600px', theme=ThemeType.DARK))# 设置是否显示省份geo.add_schema(maptype='china', label_opts=opts.LabelOpts(is_show=True))# 绘制什么类型图 热力图 涟漪图等geo.add('相亲男女人数', data_pair=area_count, type_=ChartType.EFFECT_SCATTER)geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 不显示数据标签geo.set_global_opts(title_opts=opts.TitleOpts(title="相亲男女地区分布"),visualmap_opts=opts.VisualMapOpts(max_=5000, is_piecewise=True, # 划分区间是否精确pieces=[{"max": 1000, "min": 100, "label": "100-1000", "color": "#708090"}, # 分段 添加图例注释 和颜色{"max": 1500, "min": 1001, "label": "1001-1500", "color": "#00008B"},{"max": 2000, "min": 1501, "label": "1501-2000", "color": "#483D8B"},{"max": 2500, "min": 2001, "label": "2001-2500", "color": "#1E90FF"},{"max": 3000, "min": 2501, "label": "2501-3000", "color": "#8B008B"},{"max": 5000, "min": 3001, "label": ">=3000", "color": "#FF0000"}]))geo.render('地区分布.html')
[('重庆', 4436), ('广东', 2637), ('四川', 2519), ('山东', 2398), ('河南', 2160), ('上海', 2156), ('云南', 2039), ('北京', 2037), ('台湾', 1997), ('安徽', 1920), ('江苏', 1919), ('天津', 1918), ('黑龙江', 1918), ('湖南', 1800), ('新疆', 1799), ('辽宁', 1680), ('甘肃', 1680), ('广西', 1679), ('湖北', 1679), ('内蒙古', 1559), ('山西', 1440), ('福建', 1440), ('江西', 1440), ('浙江', 1440), ('陕西', 1439), ('河北', 1439), ('青海', 1339), ('贵州', 1200), ('吉林', 1080), ('西藏', 942), ('宁夏', 702), ('海南', 360), ('香港', 353), ('澳门', 117)]# -*- coding: UTF-8 -*-"""@File :征婚宣言词云.py@Author :叶庭云@CSDN :https://yetingyun.blog.csdn.net/"""import pandas as pdimport jiebaimport collectionsimport refrom wordcloud import WordCloudimport matplotlib.pyplot as pltimport numpy as npfrom PIL import Image# 提取性别 征婚宣言这两列数据就好df = pd.read_excel('处理后数据.xlsx')[['性别', '征婚宣言']]# df1 = df[df['性别'] == '女士']['征婚宣言']df2 = df[df['性别'] == '女士']['征婚宣言']# 读取停用词数据with open('stop_words.txt', encoding='utf-8') as f:con = f.read().split('\n') # 得到每一行的停用词stop_words = set()for i in con:stop_words.add(i)result_list = []for data in df2:# 文本预处理 去除一些无用的字符 只提取出中文出来new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)new_data = "/".join(new_data)# 文本分词seg_list_exact = jieba.cut(new_data, cut_all=True)# 去除停用词和单个词for word in seg_list_exact:if word not in stop_words and len(word) > 1:result_list.append(word)print(result_list)# 筛选后统计word_counts = collections.Counter(result_list)mask_ = 255 - np.array(Image.open('woman_mask.png'))# 绘制词云my_cloud = WordCloud(background_color='white', # 设置背景颜色 默认是blackmask=mask_,font_path='simhei.ttf', # 设置字体 显示中文max_font_size=112, # 设置字体最大值min_font_size=12, # 设置字体最小值random_state=88 # 设置随机生成状态,即多少种配色方案).generate_from_frequencies(word_counts)# 绘制词云plt.figure(figsize=(8, 5), dpi=200)# 显示生成的词云图片plt.imshow(my_cloud, interpolation='bilinear')# 显示设置词云图中无坐标轴plt.axis('off')plt.savefig('woman_cloud.png', dpi=200)plt.show()



程序员如何避免陷入“内卷”、选择什么技术最有前景,中国开发者现状与技术趋势究竟是什么样?快来参与「2020 中国开发者大调查」,更有丰富奖品送不停!

☞估值飙至 280 亿美元,Databricks G 轮融资 10 亿美元,谁说开源不挣钱?
☞Windows 会有开源的一天吗?
☞抖音否认封杀腾讯;程序员拒绝带电脑回家被开除,获赔 19.4 万;Excel 具备图灵完备性 | 极客头条
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 习近平同马克龙交流互动的经典瞬间 7904601
- 2 仅退款225个快递女子曾打造富婆人设 7807864
- 3 确认完最后一步 反诈民警蹲地上哭了 7714122
- 4 三项世界级成就见证中国实力 7619065
- 5 荷兰大臣:没想到中方叫停芯片出口 7519876
- 6 美国发生特大诈骗案 特朗普怒批 7427208
- 7 危险信号!俄数百辆保时捷突然被锁死 7330176
- 8 众擎T800人形机器人一脚踹倒自家CEO 7236401
- 9 15岁高中生捐赠南京大屠杀日军罪证 7140970
- 10 今日大雪 要做这些事 7046854










CSDN
