【Pandas数据清洗与处理】项目1-知乎数据清洗与处理

【项目01】 知乎数据清洗整理和结论研究

要求:
1、数据清洗 - 去除空值
要求:创建函数
提示:fillna方法填充缺失数据,注意inplace参数,文本型字段空值改为“缺失数据”,数字型字段空值改为 0

2、问题1 知友全国地域分布情况,分析出TOP20
要求:
① 按照地域统计 知友数量、知友密度(知友数量/城市常住人口),不要求创建函数
② 知友数量,知友密度,标准化处理,取值0-100,要求创建函数
③ 通过多系列柱状图,做图表可视化
提示:
① 标准化计算方法 = (X - Xmin) / (Xmax - Xmin)
② 可自行设置图表风格

3、问题2 知友全国地域分布情况,分析出TOP20
要求:
① 按照学校(教育经历字段) 统计粉丝数(‘关注者’)、关注人数(‘关注’),并筛选出粉丝数TOP20的学校,不要求创建函数
② 通过散点图 → 横坐标为关注人数,纵坐标为粉丝数,做图表可视化
③ 散点图中,标记出平均关注人数(x参考线),平均粉丝数(y参考线)
提示:
① 可自行设置图表风格

import pandas as pd
import numpy as np
data1 = pd.read_csv('./知乎数据_201701.csv',engine='python')
data2 = pd.read_csv('./六普常住人口数.csv',engine='python')

1、数据清洗 - 去除空值

def fill_null(df):
    cols=df.columns
    for col in cols:
        if df[col].dtype=='object':
            df[col].fillna('缺失数据',inplace=True)
        else:
            df[col].fillna(0,inplace=True)
    return df
data1_c=fill_null(data1)

问题1 知友全国地域分布情况,分析出TOP20

要求:
① 按照地域统计 知友数量、知友密度(知友数量/城市常住人口),不要求创建函数
② 知友数量,知友密度,标准化处理,取值0-100,要求创建函数
③ 通过多系列柱状图,做图表可视化
提示:
① 标准化计算方法 = (X - Xmin) / (Xmax - Xmin)

data1_c.rename(columns={'_id':'id'},inplace=True)

df_city = data1_c.groupby('居住地').count()
data2['city']=data2['地区'].str[:-1]
q1data=pd.merge(df_city,data2,left_index=True,right_on='city',how='inner')[['id','city','常住人口']]
q1data['知友密度']=q1data['id']/q1data['常住人口']
q1data

数据标准化

def data_nor(df,*cols):
    colnames=[]
    for col in cols:
        colname=col+'_nor'
        df[colname]=(df[col]-df[col].min())/(df[col].max()-df[col].min())*100
        colnames.append(colname)
    return(df,colnames)

result_cols=data_nor(q1data,'id','知友密度')[1]
result_data=data_nor(q1data,'id','知友密度')[0]
q1data_top20_sl=result_data.sort_values(result_cols[0],ascending=False)[['city',result_cols[0]]].iloc[:20]
q1data_top20_md=result_data.sort_values(result_cols[1],ascending=False)[['city',result_cols[1]]].iloc[:20]
import matplotlib.pyplot as plt
#中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
fig1=plt.figure(num=1,figsize=(12,8))
y1=q1data_top20_sl[result_cols[0]]
plt.bar(range(20),
        y1,
        width=0.8,
        facecolor='cyan',
        edgecolor='k',
        align='center',
        tick_label=q1data_top20_sl['city']
)
plt.title('知友数量TOP20\n',fontsize=20)
plt.xlabel('城市',fontsize=20)
plt.ylabel('知友数量',fontsize=20)

#坐标轴刻度的字体大小
plt.tick_params(labelsize=13)

#给图形添加数据标签
for i,j in zip(range(20),y1):
    plt.text(i, j+0.2, '%.0f' %j, ha='center', va= 'bottom',fontsize=12)
    
fig2 = plt.figure(num=2,figsize=(12,8))
y2 = q1data_top20_md[result_cols[1]]
plt.bar(range(20),
        y2,
        width = 0.8,
        facecolor = 'lightskyblue',
        edgecolor = 'k',
        tick_label = q1data_top20_md['city'])

plt.title('知友密度TOP20\n',fontsize=20)
plt.xlabel('城市',fontsize=20)
plt.ylabel('知友密度',fontsize=20)

for i,j in zip(range(20),y2):
     plt.text(i, j+0.2, '%.1f' %j, ha='center', va= 'bottom',fontsize=12)

在这里插入图片描述
在这里插入图片描述

问题2 不同高校知友关注和被关注情况

要求:
① 按照学校(教育经历字段) 统计粉丝数(‘关注者’)、关注人数(‘关注’),并筛选出粉丝数TOP20的学校,不要求创建函数
② 通过散点图 → 横坐标为关注人数,纵坐标为粉丝数,做图表可视化
③ 散点图中,标记出平均关注人数(x参考线),平均粉丝数(y参考线)

q2data=data1_c.groupby('教育经历').sum()[['关注者','关注']].drop(['缺失数据','大学','本科'])
q2data_c=q2data.sort_values('关注者',ascending=False)[:20]
q2data_c.rename(columns={'关注者':'粉丝数','关注':'关注人数'},inplace=True)
y=q2data_c['粉丝数']
x=q2data_c['关注人数']
plt.figure(figsize=(18,12))
follow_mean=q2data_c['关注人数'].mean()
fans_mean=q2data_c['粉丝数'].mean()
plt.scatter(x,y,marker='.',
           s = y/1000,
           cmap = 'rainbow',
           c = y,
           label = '学校')
plt.axvline(follow_mean,hold=None,label="平均关注人数:%i人" % follow_mean,color='r',linestyle="--",alpha=0.8) 
plt.axhline(fans_mean,hold=None,label="平均粉丝数:%i人" % fans_mean,color='g',linestyle="--",alpha=0.8)
plt.legend(loc = 'upper left')
for i,j,n in zip(x,y,q2data_c.index):
    plt.text(i+500,j,n, color = 'k')

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值