关于pandas的离散化,面元划分详解

  • Post category:Python

关于pandas的离散化,面元划分详解

总体介绍

pandas离散化是为了将连续数据离散化,转化为离散的分组数据。离散化是数据预处理里一个常见的操作,常用于数据分组、高维数据降维等场景中。离散化的过程就是将连续数据划分为若干个分组的过程。

面元划分

离散化的基本方法是将数据按照一定的范围(面元)划分。比如,将年龄划分成多个年龄段,将收入划分成多个收入段等,这就是离散化的一种常见的面元划分。

pandas提供了两种进行面元划分的方法:

  1. cut()函数:

    cut()函数的对数值进行面元划分,将数据分成若干离散区间。该函数的一般形式为:pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates=’raise’)

    参数含义:

    • x:需要进行离散化分组的数据
    • bins:划分为几个区间,可以是一个整数,表示将x均分为bins段,也可以是一个List,自定义划分区间,如:[0, 60, 80, 100]
    • labels:自定义显示区间名称
    • include_lowest:指定区间是否包含左侧元素
    • duplicates:指定是否允许区间内部重复,如果为‘raise’,则重复报错;如果为‘drop’,则仅保留一个区间
  2. qcut()函数:

    qcut()函数则根据样本分位数进行划分。与cut()函数不同,qcut()按照等数量的区间进行划分,每个区间内包含相同数量的数据。该函数的一般形式为:pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates=’raise’)

    参数含义:

    • x:需要进行离散化分组的数据
    • q:确定分位数数量,可以是一个整数或以float为类型的数组。如:4将数据分为四等份,[0, 0.25, 0.5, 0.75, 1.]表示四分位数
    • labels:自定义显示区间名称
    • duplicates:指定是否允许区间内部重复,如果为‘raise’,则重复报错;如果为‘drop’,则仅保留一个区间

示例说明

离散化分组的例子1

对于某一个班级的学生的语文成绩,进行离散化分组,划分为A、B、C、D几个等级的方法如下:

import pandas as pd
import numpy as np

# 设置班级中的学生数量
num = 40

# 用np实现随机生成0~100的40个分数
score = np.random.randint(0, 100, num)

# 进行等宽离散化分组
score_bins = pd.cut(score, bins=[0, 60, 70, 80, 100], labels=['D', 'C', 'B', 'A'])

# 查看每个分数对应的离散化分类等级
print(score_bins.value_counts())

程序运行结果如下:

D    28
B     6
C     3
A     3
dtype: int64

以上程序对40个学生成绩进行等宽分组,划分区间为:0-60、60-70、70-80、80-100,分别对应等级D、C、B、A。将所有的学生成绩离散化分组后,生成对应的分级结果如上所示,其中D级有28个学生,B级有6个学生,C级有3个学生,A级有3个学生。

离散化分组的例子2

对于房价的数据集,对房价进行等数量离散化分组,分组区间数量为6的操作过程如下:

import pandas as pd

# 获取房价的数据集
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/datasets/master/zillow-eda/Zip_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv')

# 对房价的价格进行区分,划分为等数量的6个区间
df['price_zone'] = pd.qcut(df['Zhvi'], q=6)

# 查看离散化分组生成的数据
print(df[['Zhvi', 'price_zone']])

运行结果如下:

               Zhvi                        price_zone
0      557263.888889  (435763.667, 642333.333]       
1      308573.529412  (301266.667, 435763.667]       
2      238179.545455  (168568.128, 301266.667]       
3      398840.909091  (301266.667, 435763.667]       
4      285947.368421  (168568.128, 301266.667]       
...              ...                            ... 
14718  310800.000000  (301266.667, 435763.667]       
14719  511200.000000  (435763.667, 642333.333]       
14720  292714.285714  (168568.128, 301266.667]       
14721  270000.000000  (168568.128, 301266.667]       
14722  305371.428571  (301266.667, 435763.667]       

[14723 rows x 2 columns]

以上程序对房价数据集进行等数量分组,划分区间为6个。打印显示所有房价及房价离散化分组结果。