Python-数据可视化案例

 文件下载: 用于博客系列文章pandans的学习文件.zip

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

第一步: 批量处理数据

  面临的是一个和之前不一样的情况,有好多个文件要操作.

  1. 查看数据的样子
  2. 批量读取文件, os模块,获取文件列表
  3. for循环依次读取,
  4. 当你有一大堆的DataFrame想要保存的时候,可以用容器型数据.这里我们用字典保存数据.
# 数据用逗号进行分割
import os

os.listdir('lagou_copy')   # 查看文件列表
'''
['.DS_Store',
 'beijing.csv',
 'changsha.csv',
 'chengdu.csv',
 'chongqing.csv',
 'foshan.csv',
 'guangzhou.csv',
 'hangzhou.csv',
 'nanjing.csv',
 'shanghai.csv',
 'shenzhen.csv',
 'suzhou.csv',
 'tianjin.csv',
 'wuhan.csv',
 'xiamen.csv',
 'xian.csv',
 'zhengzhou.csv',
 '修改记录.txt']
'''

# 把想要读取的文件名称保存下来
file_name_list = []
# 批量读取
for filename in os.listdir('lagou_copy'):
    # 过滤条件, 只要csv文件
    if filename[-4:] == '.csv':
#         print(filename)
        file_name_list.append(filename)
        
file_name_list
'''

['beijing.csv',
 'changsha.csv',
 'chengdu.csv',
 'chongqing.csv',
 'foshan.csv',
 'guangzhou.csv',
 'hangzhou.csv',
 'nanjing.csv',
 'shanghai.csv',
 'shenzhen.csv',
 'suzhou.csv',
 'tianjin.csv',
 'wuhan.csv',
 'xiamen.csv',
 'xian.csv',
 'zhengzhou.csv']
'''

# 批量读取
# 存到字典里面
lagou_dict = {}
for filename in file_name_list:
    key = filename[:-4]
    # 读取数据
    value = pd.read_csv('lagou_copy/'+filename)
    # 在字典里面添加一个键值对
    lagou_dict[key] = value
 
lagou_dict.keys() 
'''
dict_keys(['zhengzhou', 'xiamen', 'foshan', 'xian', 'changsha', 'wuhan', 'shenzhen', 'hangzhou', 'suzhou', 'guangzhou', 'chongqing', 'chengdu', 'shanghai', 'beijing', 'nanjing', 'tianjin'])
'''

lagou_dict['suzhou'] # 提取哪个城市就用哪个城市名称

在这里插入图片描述

# 用循环批量去除掉所有表格中的没有用的第一列

# for循环对字典进行遍历
for key in lagou_dict:
    print(key)
    lagou_dict[key].drop(columns='Unnamed: 0',inplace=True) # 删除

lagou_dict['zhengzhou']

在这里插入图片描述

# 统计每一个城市分别有多少条数据
# 将结果存到一个Series里面
# 建立一个空的
city_num = pd.Series()
# 对每个DataFrame进行遍历
for key in lagou_dict:
    # 得到DataFrame行数
    value = lagou_dict[key].shape[0]
    # 添加进Series里面去
    city_num[key] = value

# 排序
city_num.sort_values(ascending=False)
'''
beijing      450
shanghai     435
shenzhen     262
guangzhou    177
hangzhou     145
chengdu       46
wuhan         45
nanjing       30
changsha      16
xiamen        14
xian          12
foshan        10
zhengzhou      9
chongqing      8
suzhou         8
tianjin        7
dtype: int64
'''
# 对DataFrame再做一个过滤,删掉少于30条数据的城市


# 我们不直接在原来的字典中删除

# 而是弄一个新的,然后把超过30条的放进新的里面去
# 建立新字典
lagou_dict_30 = {}
for city in lagou_dict:
    # 判断这个DataFrame有没有超过30条
    if lagou_dict[city].shape[0] >= 30:
        # 如果满足条件,就添加到新字典里面去
        lagou_dict_30[city] = lagou_dict[city]

lagou_dict_30.keys()
'''
dict_keys(['wuhan', 'shenzhen', 'hangzhou', 'guangzhou', 'chengdu', 'shanghai', 'beijing', 'nanjing'])

'''
# 批量统计一下这些表格中的空值情况
for city in lagou_dict_30:
    print(city)
    print(lagou_dict_30[city].isnull().sum())
    print('-'*30)
'''
wuhan
标题      0
城市      3
地点      1
薪资待遇    3
岗位要求    0
名称      0
级别      0
岗位技能    0
短评      0
dtype: int64
------------------------------
shenzhen
标题      0
城市      0
公司地点    0
薪资待遇    0
工位要求    0
公司名称    0
公司级别    0
岗位技能    0
公司短评    0
dtype: int64
------------------------------
hangzhou
标题      0
城市      0
公司地点    0
薪资待遇    0
工位要求    0
公司名称    0
公司级别    0
岗位技能    0
公司短评    0
dtype: int64
------------------------------
guangzhou
标题      0
城市      0
公司地点    0
薪资待遇    0
工位要求    0
公司名称    0
公司级别    0
岗位技能    0
公司短评    0
dtype: int64
------------------------------
chengdu
标题      0
城市      0
公司地点    0
薪资待遇    0
工位要求    0
公司名称    0
公司级别    0
岗位技能    1
公司短评    0
dtype: int64
------------------------------
shanghai
标题      0
城市      0
公司地点    0
薪资待遇    0
工位要求    0
公司名称    0
公司级别    0
岗位技能    1
公司短评    0
dtype: int64
------------------------------
beijing
标题      0
公司地点    0
薪资待遇    0
工位要求    0
公司名称    0
公司级别    0
岗位技能    1
公司短评    0
dtype: int64
------------------------------
nanjing
标题      0
城市      2
公司地点    1
薪资待遇    2
工位要求    0
公司名称    1
公司级别    0
岗位技能    0
公司短评    0
dtype: int64
------------------------------
'''
# 城市这一列必须要先进行填充


# 对所有城市都填充城市众数
for key in lagou_dict_30:
    # 判断这个城市有没有这一列
    if '城市' in lagou_dict_30[key].columns: # 有这一列
        # 填充
        lagou_dict_30[key].城市.fillna(lagou_dict_30[key].城市.mode()[0],inplace=True)

第二步:合并数据

# 三分钟时间自己试一下合并数据

# 定义一个空的DataFrame, 把所有的DataFrame都合并到这里面来
df = pd.DataFrame()

# 对字典进行遍历
for key in lagou_dict_30:
    
    df = df.append(lagou_dict_30[key] ,  ignore_index=True,sort=False) # 忽略原索引


# 发现有一些相同的字段用的是不同的名称

# 所以需要进一步处理,首先找出哪些字段存在问题

# 把所有表格列名打印出来观察
for key in lagou_dict_30:
    print(key)
    print(lagou_dict_30[key].columns)
    print('-'*30)
'''
wuhan
Index(['标题', '城市', '地点', '薪资待遇', '岗位要求', '名称', '级别', '岗位技能', '短评'], dtype='object')
------------------------------
shenzhen
Index(['标题', '城市', '公司地点', '薪资待遇', '工位要求', '公司名称', '公司级别', '岗位技能', '公司短评'], dtype='object')
------------------------------
hangzhou
Index(['标题', '城市', '公司地点', '薪资待遇', '工位要求', '公司名称', '公司级别', '岗位技能', '公司短评'], dtype='object')
------------------------------
guangzhou
Index(['标题', '城市', '公司地点', '薪资待遇', '工位要求', '公司名称', '公司级别', '岗位技能', '公司短评'], dtype='object')
------------------------------
chengdu
Index(['标题', '城市', '公司地点', '薪资待遇', '工位要求', '公司名称', '公司级别', '岗位技能', '公司短评'], dtype='object')
------------------------------
shanghai
Index(['标题', '城市', '公司地点', '薪资待遇', '工位要求', '公司名称', '公司级别', '岗位技能', '公司短评'], dtype='object')
------------------------------
beijing
Index(['标题', '公司地点', '薪资待遇', '工位要求', '公司名称', '公司级别', '岗位技能', '公司短评'], dtype='object')
------------------------------
nanjing
Index(['标题', '城市', '公司地点', '薪资待遇', '工位要求', '公司名称', '公司级别', '岗位技能', '公司短评'], dtype='object')
------------------------------
'''

d = {'地点':'公司地点','岗位要求':'工位要求','名称':'公司名称',
    '级别':'公司级别','短评':'公司短评'}

# 把武汉数据里面不一样的列名改成统一的
lagou_dict_30['wuhan'].rename(columns=d,inplace=True)

# 重新进行合并
# 定义一个空的DataFrame, 把所有的DataFrame都合并到这里面来
df = pd.DataFrame()
# 对字典进行遍历
for key in lagou_dict_30:
    
    df = df.append(lagou_dict_30[key] ,  ignore_index=True,sort=False) # 忽略原索引

第三步:简单了解数据

df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1590 entries, 0 to 1589
Data columns (total 9 columns):
标题      1590 non-null object
城市      1140 non-null object
公司地点    1588 non-null object
薪资待遇    1585 non-null object
工位要求    1590 non-null object
公司名称    1589 non-null object
公司级别    1590 non-null object
岗位技能    1587 non-null object
公司短评    1590 non-null object
dtypes: object(9)
memory usage: 111.9+ KB
'''

# 把城市中空值数据过滤出来
df[df.城市.isnull()]
# 把城市中的空值填充成北京
df.城市.fillna('北京',inplace=True)
df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1590 entries, 0 to 1589
Data columns (total 9 columns):
标题      1590 non-null object
城市      1590 non-null object
公司地点    1588 non-null object
薪资待遇    1585 non-null object
工位要求    1590 non-null object
公司名称    1589 non-null object
公司级别    1590 non-null object
岗位技能    1587 non-null object
公司短评    1590 non-null object
dtypes: object(9)
memory usage: 111.9+ KB
'''

# 提取所有空值
df[df.isnull().sum(axis=1) > 0]

df.describe()

在这里插入图片描述

进一步处理数据


# 把公司地点中的括号去掉
df.公司地点 = df.公司地点.str.replace('[','').str.replace(']','')


# 想办法把部分和要求的工位要求数据提取出来
# 发现规则: 错误的没有k字母,正确的有k字母
# 保存成t
t = df[~(df.工位要求.str.contains('k') | df.工位要求.str.contains('K')) ]

# 用新的正确的数据,覆盖原来的三个错误数据
df.loc[t.index, '工位要求'] = ["8k-16k ",'6k-8k ','6k-9k '] + df.loc[t.index, '工位要求']


# 拆分
df[['薪资','经验要求','临时','学历']] = df.工位要求.str.split(' ',expand=True)
# 删掉三列不需要的数据
df.drop(columns=['薪资待遇','工位要求','临时'],inplace=True)



# 处理薪资列,拆分成最大值和最小值

# 将k替换成000 , K也替换
t2 = df.薪资.str.replace('k','000').str.replace('K','000')

# 传回原数据
df[['最低薪资','最高薪资']] = t2.str.split('-',expand=True)

# 将两列薪资改成整数型
df.最低薪资 = df.最低薪资.astype('int')
df.最高薪资 = df.最高薪资.astype('int')
# 计算平均薪资, 整除2
df['平均薪资'] = (df.最低薪资 + df.最高薪资)//2
# 删除调原薪资列
df.pop('薪资')


# 公司级别拆分成三列

df[['公司类型','融资阶段','公司规模']] = df.公司级别.str.split(' / ',expand=True)
# 把原来的列删除掉
df.pop('公司级别')

# 调整列顺序
df = df[['标题','城市','公司名称','公司地点','公司类型',
   '融资阶段','公司规模','经验要求','学历',
   '最低薪资','最高薪资','平均薪资',
   '岗位技能','公司短评']]

第四步:数据统计分析

# 城市分布
df.城市.value_counts()
'''
北京    450
上海    435
深圳    262
广州    177
杭州    145
成都     46
武汉     45
南京     30
Name: 城市, dtype: int64
'''

plt.style.use("seaborn") 

# windows电脑 Matplotlib 支持中文
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

df.城市.value_counts().plot(kind='bar');

在这里插入图片描述

# 经常要绘制柱状图
def bar(column):
    """传入列名,绘制柱状图"""
    return df[column].value_counts().plot(kind='bar');
   
bar('融资阶段');

在这里插入图片描述

# 薪资的密度曲线/直方图
df[['最低薪资','平均薪资','最高薪资']].plot(kind='kde')
plt.xlim(-10000,100000);

在这里插入图片描述

分组统计

  不同类别的薪资情况

df.groupby('城市').mean()

在这里插入图片描述

# 排序
df.groupby(by='城市').mean().sort_values(by ='平均薪资' ,ascending=False)

在这里插入图片描述

# 其他统计值
df.groupby('城市')['平均薪资'].agg(['max','min','median','mean'])

在这里插入图片描述

# 定义函数,分组统计
def group_salary(column):
    return df.groupby(column).mean().sort_values(by ='平均薪资' ,ascending=False)
group_salary('融资阶段')

在这里插入图片描述

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值