天天看点

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

作者:软件编程指南
第五篇:数据操作与转换:学会利用Pandas处理复杂任务
天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄!

本系列文章还是引用之前的理念,阅读文章,你不需要记,只要知道这一篇在讲什么即可,收藏起来,用的时候过来抄代码。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

好了,通过前面四节的Pandas技能学习,现在我们已经了解了Pandas所有的数据处理技巧,本篇我们主要就是实战,处理相对复杂的案例。

在本篇章节中,我们将爬取杭州租赁信息,并通过前面四节学习的pandas知识,对数据进行清洗和分析。然后利用Pyecharts生成图表。在本篇文章中,你可以学习到实战案例,并最终可以掌握生成报表的知识。

注意: 如果下面案例,对Pandas语法还不太熟, 请重新复习。《第二篇:数据探索与清洗:使用Pandas轻松预处理数据》

第五篇:数据操作与转换:学会利用Pandas处理复杂任务
  • 第一篇:Pandas入门指南:掌握Python数据处理利器
  • 第二篇:数据探索与清洗:使用Pandas轻松预处理数据
  • 第三篇:深入了解Pandas数据结构:Series与DataFrame
  • 第四篇:数据选择与过滤:Pandas中的强大索引技巧
  • 第五篇:数据操作与转换:学会利用Pandas处理复杂任务【当前篇】

一、核心知识点

爬取杭州房屋租赁信息,对杭州房屋租赁市场进行分析,并最终生成分析报表。这中间有四个方面的技术点:

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

1.1 数据爬取

本篇文章的数据爬取,我们直接使用RPA工具, 进行爬取。所谓RPA工具,其实就是软件工具,用于自动化执行重复、规范和可预测的任务。RPA工具通过模拟和自动化人类在计算机上的交互,可以执行各种操作,如数据输入、处理等。可以做到爬虫的功能。

本篇我们要使用的工具是: `八爪鱼采集器` ,当然像这类工具还有很多,比如影刀、后裔采集器等。

这些工具都是可视化的,非常适合小白。不过处理起来还是有些局限性,不是特别的灵活和容易控制,如果本系列文章效果不错,小编可能还会出RPA工具系列的文章。

1.2 数据清洗

将爬取的数据,导出CSV文件,然后通过Pandas读取文件,并对数据进行清洗和转换。得到我们最终想要的数据。

这里面主要用到的就是在第二篇中我们所学习的Pandas知识, 如果忘记了,可以重新回去看看。

1.3 数据分析

对清洗后的数据,进行数学处理,得到我们的分析数据。这里我们主要用到的功能,都是Pandas基本的功能。 so easy。

1.4 生成报表

报表的展示我们采用Pyecharts报表工具,干过开发的同学多少都听过Echarts,Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。所以本节也会演示Pyecharts的处理。

好了,废话不多说,本期的主要内容就是这些,下面开始实操。

二、案例实操

2.1 数据采集

这里直接使用八爪鱼采集器进行采集。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

这就是八爪鱼采集器,可以看到模版还挺多的,我们点击这些模版,基本不用配置什么就可以继续进行数据采集。

这里我们直接使用安居客的数据,输入安居客的地址,点击自动识别网页。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

可以看到自动识别后的数据在下面展示。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

如果是我们要的数据,那么我们就可以点击右上角的采集按钮,进行采集。可以看到我的采集数据正在采集中了。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

等待任务执行完成后,我们就可以导出数据了。点击右下角的数据导出。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

到这里我们就生成了一份原始采集数据。

杭州地铁线租房_杭州租房_价格_房价_房产网-安居客租房网.csv

2.2 数据清洗

首先我们打开数据看下,有用的信息还是不少呢,不过有点分散。需要我们进行梳理下。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

下面我们就用Pandas对数据进行处理吧。

2.2.1 数据读取

  • read_csv 函数读取csv文件
import pandas as pd
# 原始数据
ori_home_list = pd.read_csv('./杭州地铁线租房_杭州租房_价格_房价_房产网-安居客租房网.csv')
# 一共885条有效数据
len(ori_home_list)
ori_home_list.columns           

看一下列名称,有点乱: Index([‘标题’, ‘标题链接’, ‘图片’, ‘标签’, ‘标签1’, ‘标签2’, ‘标签3’, #‘detailsitem’,‘detailsitem_链接’, ‘detailsitem4’, ‘关键词’, ‘zuside’],dtype=‘object’)

因为乱,所以下面我们要对这些列进行清洗,清洗的方法,可能是替换,也可能是抽取里面的数据。下面处理的步骤,小编都配有图,通过观察图中原始数据的规则,利用合适的方法,进行数据清洗。

2.2.2 处理房型

通过表格中的数据,我们发现标签1和标签2加起来就是房型。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

下面我们写一个函数将标签1和2进行合并。

  • apply 逐行执行函数
def funcHomeType(df):
    fx = '{}室{}厅'.format(df['标签1'],df['标签2'])
    df['房型'] = fx
    return df

ori_home_list.apply(func = funcHomeType , axis=1 )           

2.2.3 处理区域

可以看到我们的区域信息是在 detailsitem 列中, 由于这个字段中文本较多,所以处理起来比较困难。具体的处理代码实现细节,下面用代码和配图展示。内容较多,一定要理解。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

我们先打印下原始数据,可以看到是有换行符的。下面我们主要使用2个处理技巧,将数据进行提取。split函数: 通过输入分隔字符,将数据分隔成数组。 然后第二个是 strip函数: 清除字符前后的空格。

下面我们看下面的处理步骤,首先看下原始数据,我们看到是使用\n换行符进行分隔的。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

那么我们就可以先通过换行符进行分隔。

- home_list['detailsitem'].str.split('\n')[1][2] 通过换行进行分隔,先拿到带有区域的文本。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

- home_list['detailsitem'].str.split('\n')[1][2].strip() `移除先后空格`

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

- home_list['detailsitem'].str.split('\n')[1][2].strip().split(' ') `根据空格再分隔`

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

- home_list['detailsitem'].str.split('\n')[1][2].strip().split(' ')[0] `得到区域`

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

- home_list['detailsitem'].str.split('\n')[1][2].strip().split(' ')[0].split('-') `得到区域`

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

思路就是这样啊,下面我们在函数中处理。

def funcHomeType(df):
    fx = '{}室{}厅'.format(df['标签1'],df['标签2'])
    df['房型'] = fx

    address = df['detailsitem'].split('\n')[2].split('\n')[0].strip()
    df['区域'] = address.split(' ')[0].split('-')[0]
    return df           

2.2.4 清洗面积

面积其实就是标签3,所以这里我们可以重命名,也可以新增一列。我这列采用新增一列。

home_list['面积'] = home_list['标签3']           

2.2.5 清洗价格

规则比较简单: 直接通过正则提取。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务
home_list['租赁价格'] = home_list['zuside'].str.extract('(\d+) 元/月')           

2.2.6 清洗地铁距离和线路

规则: 都是数字, 通过?号线能定位到线路; 通过站?m能定位到距离。所以我们直接通过正则提取。

这里会运用到正则匹配的知识,其中\d+ 意思是匹配1个或多个数字。 .*是匹配任何字符。如果你对正则不是熟悉,可以在网站搜索。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务
home_list['地铁距离'] = home_list['关键词'].str.extract('站(.*)')
home_list['地铁线路'] = home_list['关键词'].str.extract('(\d+)号线')           

2.2.7 清洗小区

新增一列

home_list['小区'] = home_list['detailsitem4']           

2.2.8 保存清洗后的数据

通过上面的提取,我们可以得到 [‘区域’,‘小区’,‘面积’,‘租赁价格’,‘房型’,‘地铁距离’,‘地铁线路’], 我们只保留这些列,然后保存到 home.xlsx文件中。

new_home_list = home_list[['区域','小区','面积','租赁价格','房型',
                           '地铁距离','地铁线路']]
new_home_list.to_excel('home.xlsx')           

2.3 数据分析 & 生成报表

2.3.1 杭州市平均租赁价格

公式: sum(总租赁价格) / sum(总租赁面积)

  • 这里我们会对面积和租赁价格进行数学计算,所以需要就将他们转换成浮点型。
  • sum对某一列进行求和,然后相除。

结论: 杭州市单位面积租赁价格,约为: 90元

# 转换成浮点型
new_home_list['面积'] = new_home_list['面积'].astype(float)
new_home_list['租赁价格'] = new_home_list['租赁价格'].astype(float)
price_unit = new_home_list['租赁价格'].sum() / new_home_list['面积'].sum()

# '杭州市平均租赁价格: 90.0678446063538'
'杭州市平均租赁价格: {}'.format(price_unit)           

2.3.2 杭州各区域租赁价格

前面是杭州范围的租赁价格,这里我们求每个区域的租赁价格。其实就是根据区域进行分组。在pandas中可以使用 groupby函数,按照区域的维度看单位面积的平均价格。

grouped = new_home_list.groupby('区域')
# 会重新生成一列数据
grouped = grouped['租赁价格'].sum() / grouped['面积'].sum()
area_price = grouped.reset_index()
# 新生成的每平米的租赁价格,重命名
area_price = area_price.rename(columns={0:'租赁价/米'})           
  • x轴是区域
  • y轴是价格

然后我们生成报表

from pyecharts import options as opts
from pyecharts.charts import Bar

bar_chart = Bar()
bar_chart.add_xaxis(area_price['区域'].tolist())
bar_chart.add_yaxis('租赁价/米', area_price['租赁价/米'].tolist(),
          markline_opts=opts.MarkLineOpts(data=[
          opts.MarkLineItem(type_="average")]))
bar_chart.set_global_opts(title_opts=opts.TitleOpts(title="区域租赁价格柱状图"))
bar_chart.set_series_opts(label_opts=opts.LabelOpts(position='top'))
bar_chart.render_notebook()           
第五篇:数据操作与转换:学会利用Pandas处理复杂任务

2.3.3 杭州房源分布分析

grouped = new_home_list.groupby(by=['区域'])['区域'].count()

# 将DataFrame的两列数据转换为饼图数据格式
data_list = list(zip(grouped.index.tolist(), grouped.tolist()))

#[('上城', 75),
# ('临安', 15),
# ('临平', 45),
# ('余杭', 15),
# ('拱墅', 210),
# ('滨江', 30),
# ('萧山', 405),
# ('西湖', 75),
# ('钱塘', 15)]
data_list

from pyecharts import options as opts
from pyecharts.charts import Pie

pie_chart = Pie()
# 设置饼图的数据和标签
pie_chart.add("", data_list)

# 设置饼图的标题和样式
pie_chart.set_global_opts(title_opts=opts.TitleOpts(title="杭州房源分布分析"), 
                          legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", 
                          pos_left="2%"))
pie_chart.render_notebook()           
第五篇:数据操作与转换:学会利用Pandas处理复杂任务

2.3.4 房租最贵的小区 TOP 10

同样使用groupby小区的维度,计算单位面积租金。

grouped = new_home_list.groupby(by=['小区'])['租赁价格'].sum() / 
          new_home_list.groupby(by=['小区'])['面积'].sum()
# 根据价格进行排期          
grouped = grouped.sort_values(ascending=False)
# 获取前10小区
grouped = grouped.head(10)
grouped = grouped.sort_values()           

生成条形图

  • add_xaxis 添加x坐标数据
  • add_yaxis 添加y坐标数据
  • reversal_axis 左边反转,柱形图转条形图
bar_chart = Bar()
bar_chart.add_xaxis(grouped.index.tolist())
bar_chart.add_yaxis('租赁平方价/元', grouped.round(2).tolist())
# 柱状图反转成条形图
bar_chart.reversal_axis()
bar_chart.set_global_opts(title_opts=opts.TitleOpts(title="房租最贵的小区 TOP 10"))
bar_chart.set_series_opts(label_opts=opts.LabelOpts(position='right'))
bar_chart.render_notebook()           
第五篇:数据操作与转换:学会利用Pandas处理复杂任务

全系列课程均是免费, 你的关注是我继续的动力,下篇更精彩。

第五篇:数据操作与转换:学会利用Pandas处理复杂任务

继续阅读