Pandas分组与分箱

目录

分组

df.groupby分组函数返回分组对象

去除每组第一条或最后一条数据

获取分组后的每组名称

get_group()按组依据获取其中一组

分组聚合

分组后直接聚合

分组后指定单列或多列聚合

分组后使用多个聚合函数

分组后对多列分别使用不同的聚合函数

分组后使用自定义聚合函数

分箱(数据离散化)


分组

df.groupby分组函数返回分组对象

准备数据

import pandas as pd

# 1.1  df.groupby分组函数返回分组对象
df = pd.read_csv('../data/b_LJdata.csv')
df2 = df.head(20).copy()
df2
  1. 基于一列进行分组

    gs = df2.groupby(by="区域") # DataFrameGroupBy
    print(gs)
    print(gs['价格'])

  1. 基于多列进行分组

    gs = df2.groupby(by=["区域", "户型"])
    print(gs)

  1. 返回的分组对象可以直接使用,或选择一列做聚合、转换、过滤操作;比如要计算不同区域、不同户型的平均租金

    df2.groupby(by=["区域", "户型"])['价格'].mean()

去除每组第一条或最后一条数据

# 分组
gs2 = df2.groupby(by="户型")

# 取出每组第一条数据
gs2.first()

# 取出每组最后一条数据
gs2.last()

获取分组后的每组名称

  1. 基于一列分组

    1.3 获取分组后每组的名称

    gs2 = df2.groupby(by="户型")
    gs2.grouper.result_index

  1. 基于多列分组

    gs3 = df2.groupby(by = ["区域","户型"])
    print(gs3.grouper.result_index)

get_group()按组依据获取其中一组

gs2.get_group(name='3室1厅')

分组聚合

分组后直接聚合

分组后直接进行聚合计算并返回df
df.groupby(by=[列名1, 列名2, ...]).聚合函数()

# 求 根据 户型 分组, 求平均值
result = df2.groupby(by='户型').mean()
result

分组后指定单列或多列聚合

根据1列或多列的值进行分组后, 每一组都对指定列的值使用聚合函数(比如mean求平均值)进行计算

对一列聚合可以使用一个[], 返回series对象 ; 也可以使用两个[], 返回dataframe对象

对多列聚合建议使用两个[[]], 返回dataframe对象

df.groupby(['列名1', '列名2'])['指定列1'].聚合函数() df.groupby(['列名1', '列名2'])[['指定列1', '指定列2', ...]].聚合函数()

  1. 按户型分组,计算每组价格的平均值

    求 根据 户型 分组, 求 面积的 平均值

    result = df2.groupby(by='户型')["面积"].mean()
    print(type(result))
    print('================================')
    result1 = df2.groupby(by='户型')[["面积"]].mean()
    print(type(result1))
    result1

  1. 按户型分组,计算每组价格和看房人数的平均值

    求 根据 户型 分组, 求 面积和价格 的平均值

    result = df2.groupby(by='户型')[["面积", "价格"]].mean()
    result

分组后使用多个聚合函数

同时使用多个内置聚合函数,全部放入一个Python列表, 然后把整个列表传入agg或aggregate函数中;返回以分组列作为索引,每一个聚合计算结果作为列的全新df

df.groupby(['列名1', '列名2'])[['指定列1', '指定列2']].agg(['max', 'min'])

max, min 为pandas内置的聚合函数名

  1. 根据 户型 分组, 求 面积和价格 的平均值和求和

    求 根据 户型 分组, 求 面积和价格 的平均值和求和

    result = df2.groupby(by='户型')[["面积", "价格"]].agg(['mean', 'sum'])
    result

  1. 根据 户型 分组, 求 面积和看房人数 的平均值和求和

    result = df2.groupby(by='户型')[["价格", "看房人数"]].agg(['mean', 'sum'])
    result

分组后对多列分别使用不同的聚合函数

agg函数中可以传入字典,字典的key是df的列名,与key对应的value是pandas内置的聚合计算函数、其名称的字符串;返回以分组列作为索引,每一个聚合计算结果作为列的全新df

df.groupby(['列名1', '列名2']).agg({ '指定列1':'mean', '指定列2':'sum', '指定列3':'mean' })

1 ) 按户型分组, 计算每组价格的平均值和看房人数的总数

result = df2.groupby(by='户型').agg({"价格":"mean", "看房人数":"sum"})
result
  1. 按户型分组, 计算 每组价格的平均值+求和 和 看房人数的总数

    按户型分组, 计算 每组价格的平均值+求和 和 看房人数的总数

    result = df2.groupby(by='户型').agg({"价格":["mean", "sum"], "看房人数":"sum"})
    result

分组后使用自定义聚合函数

  1. 自定义函数

    按户型分组, 计算每组价格和看房人数的平均值

    def fn(x):
    s_mean = x.sum() / x.size
    return s_mean

    result = df2.groupby(['户型'])[["价格", "看房人数"]].agg(fn)
    result

  1. lambda 函数

    result = df2.groupby(['户型'])[["价格", "看房人数"]].agg(lambda x: x.sum() / x.size)
    result

分箱(数据离散化)

  • pd.cut()函数用来把一组数据分割成离散的区间。比如有一组年龄数据,可以使用pandas.cut将价格数据分割成不同的价格段并打上标签。上述过程又叫做分箱。
  1. 自定义分箱个数

    分箱

    df3 = df.head(20).copy() # 复制数据集

    分箱返回Seriers对象并复制给新的列

    df3['价格高中低'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
    df3

  • 离散化分箱函数的常用参数有:

    • x 指定离散化(分箱)依据的列,Seriers对象

    • bins 分为几组,int类型,也可以传入分组区间的列表

    • labels 每组的标签名称,按数值由小到大的顺序

    • right 默认True:左开右闭;False:左闭右开

    • include_lowest 默认False:不包含第一个分组的起始值;True:包含

bins = 3,分区步骤

  1. 找出最大值 32000 ,最小值 3700

  2. 求两者的差值32000 - 3700 = 28300

  3. 区间

(3700 ~ 3700 + 28300/3] 低

(3700 + 28300/3 ~ 3700 + 28300/3*2] 中

(3700 + 28300/3*2 ~ 32000] 高

  1. 按自定义价格金额大小分为3组,将每条数据都打上高中低的标签

    df4 = df.head(20).copy() # 复制数据集

    分箱返回Seriers对象并复制给新的列

    df4['价格高中低'] = pd.cut(x=df4['价格'], bins=[0,3000,8000,210000],labels=['低', '中', '高'])
    df4

  1. 分箱后并排序

    df2 = df.head(20).copy() # 复制数据集

    分箱返回Seriers对象并复制给新的列

    df2['区间'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
    df2[['价格', '区间']].sort_values(['价格'])

df2 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df2['区间'] = pd.cut(x=df2['价格'], bins=[0, 4000, 10000, 200000])
df2[['价格', '区间']].sort_values(['价格'])
相关推荐
神奇夜光杯20 分钟前
Python酷库之旅-第三方库Pandas(181)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
光明中黑暗21 分钟前
Python 学习笔记
笔记·python·学习
tang138976431 分钟前
Python(包和模块)
开发语言·python
正义的彬彬侠44 分钟前
绘制近似线性可分支持向量机的分类边界和支持向量
人工智能·python·机器学习·支持向量机·分类·svm
纪怽ぅ1 小时前
LSTM——长短期记忆神经网络
python·深度学习·神经网络·算法·机器学习·lstm
yannan201903131 小时前
【算法】(Python)回溯算法
python·算法
心软且酷丶1 小时前
leetcode:面试题 05.07. 配对交换(python3解法)
python·算法·leetcode
菜鸟的人工智能之路1 小时前
医学数据分析中的偏特征图可视化
数据挖掘·数据分析
bigbig猩猩1 小时前
基于python的语音识别与蓝牙通信的温控系统毕设项目
python·django·语音识别
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+大模型股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
大数据·爬虫·python·深度学习·数据挖掘·数据分析·课程设计