数据处理与统计分析篇-day07-Pandas数据分析案例

导包

import numpy as np
import pandas as pd
import os
​
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
plt.rcParams['axes.unicode_minus'] = False   # 正常显示负号
​
​
os.chdir(r'D:\CodeProject\03data_processing_analysis\teacher_project')  # 改变当前的工作目录.  change current work directory

加载数据

# 1. 加载数据
df = pd.read_csv('data/LJdata.csv')
df.head()
​
# 2. 我们发现列名是中文的, 为了操作方便, 我们将其改成 英文列名.
df.columns =  ['district', 'address', 'title', 'house_type', 'area', 'price', 'floor', 'build_time', 'direction', 'update_time', 'view_num', 'extra_info', 'link']
​
# 3. 查看修改后的列名
df.columns
​
# 4. 查看处理后的数据
df.head()
​
# 5. 简单了解下数据集.
df.shape        # 维度 => 行列数, (2760, 13)
df.info()       # 基本信息
df.describe()   # 统计信息

统计分析

找出最近最低, 最高的

# 方式1: 比较运算符 实现.
# 1. 找到最低, 最高租金.
df.price.min()      # 1300
df.price.max()      # 210000
​
# 2. 根据上述的租金, 找到对应的 行(就是我们要的数据)
df[df.price == 1300]
df[df.price == 210000]
​
# 3. 用函数, 来替换上述的固定值, 使得代码更加灵活.
df[df.price == df.price.min()]
df[df.price == df.price.max()]
​
# 方式2: 通过 sort_values()排序 结合 head(), tail()实现.
# 根据价格升序排列, 然后获取对应数据即可.
df.sort_values('price').head(1)     # 租金最低
df.sort_values('price').tail(1)     # 租金最高
​
# 方式3: nlargest() 和 nsmallest()实现.
df.nsmallest(1, 'price')    # 租金最低
df.nlargest(1, 'price')     # 租金最高

最近新上的10套房源

# 方式1: sort_values()排序 + head(), tail()
df.sort_values('update_time', ascending=False).head(10)
df.sort_values('update_time').tail(10)
​
# 方式2: nlargest() 和 nsmallest()
df.nlargest(10, 'update_time')      # 报错, update_time列是字符串, 不是数值列, 不能使用该函数. 

查看所有的更新时间

# 方式1: unique()函数, 去重实现.
df.update_time.unique()
​
# 方式2: Series对象的 drop_duplicates()函数
df.update_time.drop_duplicates()
​
# 方式3: 分组统计, 去重
df.groupby('update_time', as_index=False).district.count().update_time
​
# 方式4: DataFrame对象的 drop_duplicates()函数
df.drop_duplicates('update_time').update_time

统计看房人数

# 1. 看房人数的最小值.
df.view_num.min()       # 0
# 2. 看房人数的最大值.
df.view_num.max()       # 122
# 3. 看房人数的中位数.
df.view_num.median()    # 10
# 4. 验真
df.describe()
​
# 进阶需求: 不同看房人数的房源数量.  例如:  1个人看过的, 有几套房子.   10个人看过的, 有几套房子.
# as_index=False   => 不把分组字段 作为 索引列
tmp_df = df.groupby('view_num', as_index=False).district.count()
# 改列名
# tmp_df.columns = ['看房人数', '房源数量']
tmp_df.columns = ['view_num', 'house_num']
tmp_df

图表展示上述内容

tmp_df.house_num.plot(kind='bar', figsize=(20, 10))     # 柱状图, 宽高

查看房租的价格分布

# 1. 房租的 平均值.
df.price.mean()
​
# 2. 最大值, 最小值, 中位数, 标准差, 方差
df.price.max()
df.price.min()
df.price.median()
df.price.std()
df.price.var()

看房人数最多的朝向

# 1. 统计每个朝向 有多少人看过.
tmp_df = df.groupby('direction', as_index=False).view_num.sum()
# 2. 找到看房人数最多的朝向.
tmp_df[tmp_df.view_num == tmp_df.view_num.max()]
​
tmp_df.sort_values('view_num', ascending=False).head(1)
tmp_df.sort_values('view_num').tail(1)
tmp_df.nlargest(1, 'view_num')
​
# 3. 合并版. 链式编程 = 如果一个函数的返回结果是1个对象, 那么我们可以在其后继续通过 .函数名() 的方式调用函数, 这种写法就叫: 链式编程. 
df.groupby('direction', as_index=False).view_num.sum().nlargest(1, 'view_num')

房型分布情况

# 1. 统计各种房型, 分别有多少套.
tmp_df = df.groupby('house_type').district.count() 
# 2. 修改列名
# tmp_df.columns = ['house_type', 'house_num']
​
# 把 Series对象 => DataFrame对象, 然后修改列名, 这个动作选做, 不做也不影响结果.
# tmp_df = tmp_df.to_frame()
# tmp_df.columns = ['house_num']
​
# 3. 查看结果
tmp_df
​
# 4. 绘制柱状图
tmp_df.plot(kind='bar', figsize=(20, 10))    # 柱状图, 宽高

最受欢迎的房型

# 思路: 找到 各房型看房总人数, 从中找到 看房人数最多的房型.
# 细节1: 分组统计时, 传入不同的参数, 获取对象也不同.
# df.groupby('house_type')['view_num'].sum()        # Series对象
df.groupby('house_type')[['view_num']].sum()        # df对象
​
df.groupby('house_type')[['view_num']].sum().nlargest(1, 'view_num')
​
# 方式2: 设置分组列 不作为索引列. 
df.groupby('house_type', as_index=False)['view_num'].sum().nlargest(1, 'view_num')

房子的平均租房价格

# 思路1: 总的价格 / 总的面积,  不考虑权重. 
df.price.sum()      # 20895410
df.area.sum()       # 241938
​
df.price.sum() / df.area.sum()      # 86.36679645198356
​
# 思路2: 计算每套房子的 每平米的租金, 然后计算所有所有房子 租金/平米 的平均值.
# 新增一列
df['price_m2'] = df.price / df.area
​
# 最终计算 所有房子的 每平米租金 的平均值.
df.price_m2.mean()      # 87.72268429900454

热门小区

# 大白话翻译: 看房人数多的小区 = 热门小区
# 1. 计算每个小区的看房人数.
tmp_df = df.groupby('address', as_index=False)['view_num'].sum()
# 2. 改列名
tmp_df.columns = ['address', 'count']
# 3. 根据count排序, 找到前10个. 
tmp_df.nlargest(10, 'count')
tmp_df.sort_values('count', ascending=False).head(10)

房源最多的小区

# 大白话解释: 数据集中 哪个小区 房子最多
# 方式1: 传统的分组统计.
# 1. 找到每个小区的房源数量.
tmp_df = df.groupby('address', as_index=False).district.count()
# 2. 修改列名
tmp_df.columns = ['address', 'count']
# 3. 按照房源数量排序, 取第1个.
tmp_df.sort_values('count', ascending=False).head(1)
tmp_df.nlargest(1, 'count')
​
# 方式2: 直接使用 value_counts()函数
df.address.value_counts()
df.address.value_counts().head(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值