csv格式数据清洗 根据表格得出知友全国地域分布情况,分析出TOP20
本帖最后由 atrago 于 2022-3-2 17:37 编辑操作环境:Jupyter Notebook
清洗知乎数据csv格式文件分析知乎Top20知友数量全国分布情况和知友密度情况
利用Numpy模块,Pandas模块进行数据清洗,Matplotlib模块将数据可视化
成功得到知友数量全国分布情况和知友密度情况图表数据
目的:
① 按照地域统计 知友数量、知友密度(知友数量/城市常住人口)
② 知友数量,知友密度,标准化处理
③ 图表可视化
标准化计算方法 = (X - Xmin) / (Xmax - Xmin)
困难及解决方案:
1、获取数据后对数据格式排列没有清洗的概念,不知道如何两个表格数据进行合并;查询利用Numpy模块中的merge函数。
2、可视化标签设置错误;查阅matplotlib.pyplot相关阅读指导进行改。
结果:
https://img-blog.csdnimg.cn/b1544037906f454bb5df8107dd8f8ea5.png
https://img-blog.csdnimg.cn/46c6cf3f91bf4d7aaa92f8e22af021d1.png
改进计划:
1、优化代码结构逻辑
2、将函数封装成模块
Code:
import numpy as ny
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
#设置图形内嵌
import matplotlib.style as stl
stl.use('ggplot') #自带样式美化
mpl.rcParams['font.sans-serif']=['SimHei']# #指定默认字体 SimHei为黑体
#mpl.rcParams['axes.unicode_minus']=False# #用来正常显示负号
#读取数据
data1 = pd.read_csv('知乎数据_201701.csv',engine='python')
data2 = pd.read_csv('六普常住人口数.csv',engine='python')
def fun1(df):#清洗缺失值
cols = df.columns #获取列
for each in cols:
if df.dtype == 'object':
df.fillna('Missing',inplace = True)
else:
df.fillna(0,inplace = True)
return df
data1_d = fun1(data1)#处理数据,清空Nan
#data1_d.head(5)
data_city = data1_d.groupby('居住地').count()#按居住地分组
#print(data_city.head())
data2['city'] = data2['地区'].str[:-1]
#data2['city'].head()
qldata = pd.merge(data_city,data2,left_index=True,right_on='city')[['_id','city','常住人口']]
qldata['密度'] = qldata['_id'] / qldata['常住人口']
#表合并
def fun2(df,*cols):#求标准化函数封装
colnames = []
for each in cols:
colname = each + 'norm'
df = ((df - df.min()) / (df.max() -df.min())) *100 #标准化公式
colnames.append(colname)
return df,colnames
result = fun2(qldata,'_id','密度') #处理后图表
result_colname = fun2(qldata,'_id','密度') #标签名
#知友数量-城市分布数据
result_num_Top20 = qldata.sort_values(result_colname,ascending=False)[,'city']][:20]
#知友密度-城市分布数据
result_den_Top20 = qldata.sort_values(result_colname,ascending=False)[,'city']][:20]
#print(result_num_Top20])
def fun3(dk,x,y,name,n):#生成图表函数封装
fig= plt.figure(num = n,figsize=(8,3))
plt.bar(range(20),y,tick_label = x)
plt.title(name)
for i,j in zip(range(20),y):#添加标签
plt.text(i-0.5,j-2,'%.1f'% j,fontsize=10)
fun3(result_num_Top20,result_num_Top20['city'],result_num_Top20],'知友数量',1)#表1
fun3(result_den_Top20,result_den_Top20['city'],result_den_Top20],'知友密度',2)#表2
附件如下:
页:
[1]