关于pandas的离散化,面元划分详解
总体介绍
pandas离散化是为了将连续数据离散化,转化为离散的分组数据。离散化是数据预处理里一个常见的操作,常用于数据分组、高维数据降维等场景中。离散化的过程就是将连续数据划分为若干个分组的过程。
面元划分
离散化的基本方法是将数据按照一定的范围(面元)划分。比如,将年龄划分成多个年龄段,将收入划分成多个收入段等,这就是离散化的一种常见的面元划分。
pandas提供了两种进行面元划分的方法:
-
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’,则仅保留一个区间
-
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个。打印显示所有房价及房价离散化分组结果。