本文主要通过pandas,NumPy来对大数据进行处理,使用matplotlib来进行信息的图形化显示。
数据得到手,我们就需要对我们爬取的数据进行清洗工作,为之后的数据分析做铺垫,如果清洗的不到位势必会对之后的数据分析造成影响。
下文将从数据格式统一、空值处理、数据去重等方面来介绍。
该文件以`csv`的格式存储,存放在我的电脑(`r"C:\Users\22392\Desktop\enName.csv"`)
中其中的数据以`@`符号作为分隔符,仅只有`search`操作/`query`操作之中可以找到名字
`search`操作中式用户搜索的英文名字,`query`操作中则是用户想要找到对英文名字的中文名字
(在此假定为该用户的中文名字)。
数据清洗
1 .通过pd.read_csv("路径")
,来读取csv
文件,得到pandas.core.frame.DataFrame
对象
2 .将得到的data对象转化为数组,并且遍历数组
3 .通过split("@")
方法对数组中的每一条字符串数据进行遍历分割
4 .将数据分类,分别存放于二维列表query_lst
和search_lst
中
5 .把列表信息分别设置列索引,并转化为DataFrame
对象(search_data
和query_data
)
6 .search_data
存放中文名字,query_data
存放英文名字
import pandas as pd
import numpy as np
from pandas import DataFrame
data = pd.read_csv(r"C:\Users\22392\Desktop\enName.csv",sep="@ ",encoding='utf-8', engine='python')
dataset = np.asarray(data)
lst=[]
query_lst=[]
search_lst=[]
query_search_lst=[]
for x in dataset:
lst = str(x).split("@")
if lst[0]=="['query":
lst[0]='query'
lst[-1]=lst[-1][0:-2]
query_lst.append(lst)
query_search_lst.append(lst)
elif lst[0]=="['search":
lst[0]='search'
lst[-1] = lst[-1][0:-2]
search_lst.append(lst)
query_search_lst.append(lst)
search_columns = ["operate","user",'name','路径',"描述","state","时间"]
search_data = DataFrame(search_lst,columns =search_columns)
query_columns =["operate","user","name","sex","条件1","条件2","条件3","条件4","条件5","条件6","时间"]
query_data = DataFrame(query_lst,columns=query_columns)
query_data = query_data.loc[:, ["operate","user","name","sex"]]
数据去重
搜索获得的:search["operate","user",'name',"state"]
1 .去掉search_data
中name
为空的行
2 .去掉['user','name']
完全相同的行,只保留一个
3 .只保留有用的列的信息
查询获得的:query_data["operate","user","name","sex"]
1.去掉['user','name']
完全相同的行,只保留一个
2 .去掉query
中name
为空的行
3 .去掉user
重复的行,只保留第一个,确保一个用户,一个姓名
#去掉'user','name'相同的行,且name不为空
search=search_data[search_data["name"] != ""].drop_duplicates(subset=['user','name'],keep='first',inplace=False)
search=search.loc[: ,["operate","user","name","state"]]
q_data=query_data.drop_duplicates(subset=['user','name'],keep='first',inplace=False)
#将用户的名字保存在列表中
name=(q_data[q_data["name"]!=""].drop_duplicates(subset=['user'],keep='first',inplace=False)).name.tolist()
此处只列出对女生的算法分析:
1 选择sex
为female
,且name
不为空的user
信息存放在一个列表中f2_list
,遍历搜索信息;
2 由于search
中不包含性别信息,所以要通过user
是否存在于f2_list
中来进行判断,该用户是否为female
,然后将female
搜索的名字,保存在一个列表中;
3 通过dataframe
对象的value_counts()
方法获取top20数据。
#选出女生的用户
female=q_data[(q_data["sex"]=="female" )&(q_data["name"]!="") ]
f1=female.drop_duplicates(subset=['user'],keep='first',inplace=False)
f2_list=f1.user.tolist()
#选出男生的用户
male = q_data[(q_data["sex"]=="male")&(q_data["name"]!="")]
m1=male.drop_duplicates(subset=['user'],keep='first',inplace=False)
m2_list=male.user.tolist()
f3_list=[]#女生搜索的英文名字
m3_list=[]#男生搜索的英文名字
for x in range(0,len(search)):
#当用户编号出现在存储女上的用户编号的列表中的时候
if search.iloc[x,1] in f2_list:
#用户为女生
f3_list.append(search_data.iloc[x,2])
elif search.iloc[x,1] in m2_list:
#用户为男生
m3_list.append(search.iloc[x,2])
#女生top20英文名数量统计
f4=DataFrame(f3_list).value_counts()
print(f4[0:20])
#男生top20英文名统计
m4=DataFrame(m3_list).value_counts()
print(m4[0:20])
女生名字中最多的汉字top20
#对女生用户信息进行处理 {筛选掉一个用户多次输入姓名的,只保留第一个}
#出现在女生名字中对多的20个汉字(除去姓式)
f1=female.drop_duplicates(subset=['user'],keep='first',inplace=False)
f2=f1.name.tolist()
#存放姓
f3=[]
#存放名
f4=[]
book_names = ["赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "曲", "家", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "台", "丛", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文", "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "竺", "权逯", "盖益", "桓", "公", "万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻人", "东方", "赫连", "皇甫", "尉迟", "公羊", "澹台", "公冶", "宗政", "濮阳", "淳于", "单于", "太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "钟离", "宇文", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空", "亓官", "司寇", "仉", "督", "子车", "颛孙", "端木", "巫马", "公西", "漆雕", "乐正", "壤驷", "公良", "拓跋", "夹谷", "宰父", "谷粱", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦", "段干", "百里", "东郭", "南门", "呼延", "归海", "羊舌", "微生", "岳", "帅", "缑", "亢", "况", "郈", "有", "琴", "梁丘", "左丘", "东门", "西门", "商", "牟", "佘", "佴", "伯", "赏", "宫", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟", "第五", "言福"]
for x in f2:
if len(x)<2 or len(x)>4:
f2.remove(x)
elif x[0] in book_names and len(x)<4:
f3.append(x[0])
for y in x[1:]:
f4.append(y)
elif x[:2] in book_names and len(x)>2:
f3.append(x[:2])
for y in x[1:]:
f4.append(y)
else:
f2.remove(x)
#f31=DataFrame(f3).value_counts()
#print(f31[0:20])
f41=DataFrame(f4).value_counts()
#女生名字中最多的汉字top20
print(f41[0:20])
女生名字中最多的汉字top20
男生姓名中最多的汉字top20
名字字数以及单姓和复姓人数
在name列表中,进行筛选,条件为
1 姓名字数在[2,4]
2 若是单姓,则姓名长度小于4
3 若是复姓,则姓名长度大于2
4 将名字字数信息,存放在字典之中
名字中子的个数:
#单姓人数
single_count = []
#复姓人数
double_count = []
d={
"2":0,"3":0,"4":0}
book_names = ["赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈", "韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶", "姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎", "鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于", "时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴", "谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席", "季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "钟", "徐", "邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "昝", "管", "卢", "莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪", "包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀", "羊", "於", "惠", "甄", "曲", "家", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘", "景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄", "印", "宿", "白", "怀", "蒲", "台", "丛", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能", "苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍", "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "郏", "浦", "尚", "农", "温", "别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", "向", "古", "易", "慎", "戈", "廖", "庚", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文", "寇", "广", "禄", "阙", "东", "殴", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂", "晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "竺", "权逯", "盖益", "桓", "公", "万俟", "司马", "上官", "欧阳", "夏侯", "诸葛", "闻人", "东方", "赫连", "皇甫", "尉迟", "公羊", "澹台", "公冶", "宗政", "濮阳", "淳于", "单于", "太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "钟离", "宇文", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空", "亓官", "司寇", "仉", "督", "子车", "颛孙", "端木", "巫马", "公西", "漆雕", "乐正", "壤驷", "公良", "拓跋", "夹谷", "宰父", "谷粱", "晋", "楚", "闫", "法", "汝", "鄢", "涂", "钦", "段干", "百里", "东郭", "南门", "呼延", "归海", "羊舌", "微生", "岳", "帅", "缑", "亢", "况", "郈", "有", "琴", "梁丘", "左丘", "东门", "西门", "商", "牟", "佘", "佴", "伯", "赏", "宫", "墨", "哈", "谯", "笪", "年", "爱", "阳", "佟", "第五", "言福"]
for x in name:
if len(x)<2 or len(x)>4:
name.remove(x)
elif x[0] in book_names and len(x)<4:4
d[str(len(x))]+=1
single_count.append(x)
elif x[:2] in book_names and len(x)>2:
d[str(len(x))]+=1
double_count.append(x)
else:
name.remove(x)
利用series对象的plot(kind='bar')
方法,可实现柱状图的显示。
#女生top20
import matplotlib.pyplot as plt
f4=DataFrame(f3_list).value_counts()
(f4[0:20]).plot(kind='bar')
f5 =((DataFrame(f4).value_counts())[0:20]).index
lst=[]
for x in f5:
lst.append(str(x)[2])
# # #生成词云
import matplotlib.pyplot as plt
import wordcloud
plt.rcParams['font.sans-serif']=['KaiTi']
plt.rcParams['axes.unicode_minus'] = False
word_clean=" ".join(lst)
wc = wordcloud.WordCloud(font_path='C:/Windows/Fonts/simkai.ttf',#指定字体类型
background_color = "white",#指定背景颜色
max_words = 20, # 词云显示的最大词数
max_font_size = 255#指定最大字号
) #指定模板
wc = wc.generate(word_clean)##生成词云
plt.imshow(wc)
plt.axis("off")
plt.show()
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 获取数据
names =lst
nums = (DataFrame(f4).value_counts())[0:20].values
print(names)
print(nums)
# 绘图
plt.figure(figsize=[10, 6])
plt.bar(names, nums, width=0.3, color='green')
# 设置标题
plt.xlabel("字", fontproperties='SimHei', size=12)
plt.ylabel("人数", fontproperties='SimHei', rotation=90, size=12)
plt.title("女生姓名汉字top20", fontproperties='SimHei', size=16)
plt.xticks(list(names), fontproperties='SimHei', rotation=-45, size=10)
# 显示数字
for a, b in zip(list(names), list(nums)):
plt.text(a, b, b, ha='center', va='bottom', size=6)
plt.show()
#推荐的相似名,未在库中现
s1=search_data.loc[: ,["name","state"]]
s2=s1[s1["state"]=="推荐的相似名"]
s2.name.value_counts()