135、pandas操作——离散化和面元划分

对于数据进行离散化和面元划分的前提条件是:连续变化的数据

例如下面是一组人的年龄数据,现在要按照年龄划分为不同年龄的4组(即把数据拆分为4个面元),分别为“18到25”、“25到35”、“35到60”及“60以上。为了实现分组,需要使用pandas的cut函数:
135、pandas操作——离散化和面元划分_第1张图片
1.png

从运行的结果中可以看到,pandas返回的是每一个数据所在的区间范围以及数据的长度,还返回一个特殊的Categories对象,包含了分组的数量以及不同分类的名称。

还可以使用codes参数为年龄数据进行标号:
2.png

也可以使用value_counts()函数统计落在各个区间的值数量:
135、pandas操作——离散化和面元划分_第2张图片
3.png

从上面的结果还可以看到表示“区间”的符号跟数学符号一样,圆括号表示开端(不包括),方括号表示闭端(包括),可以通过设置参数right=False改变开闭端,即开端变闭端,闭端变开端。例如:
135、pandas操作——离散化和面元划分_第3张图片
4.png

还可以设置自己想要的面元名称,将labels选项设置为一个列表或数组即可:
135、pandas操作——离散化和面元划分_第4张图片
5.png

如果向cut传入面元的数量,则会根据数据的最小值和最大值计算等长面元:
6.png

qcut是类似于cut的函数,可以根据样本分位数对数据进行面元划分。

cut与qcut的区别:cut可能无法使各个面元中含有相同数量的数据点,qcut由于使用的是样本分位数,可以得到大小基本相等的面元:
135、pandas操作——离散化和面元划分_第5张图片
7.png

通过指定分位数(0到1之间的数值,包含端点)进行面元划分:
8.png

源码:

# coding: utf-8

# In[1]:

import numpy as np
from pandas import Series,DataFrame
import pandas as pd


# In[2]:

# 使用pandas的cut函数划分年龄组
ages = [20,22,25,27,21,23,37,31,61,45,32]
bins = [18,25,35,60,100]
cats = pd.cut(ages,bins)
print(cats)


# In[3]:

# 使用codes为年龄数据进行标号
cats.codes


# In[4]:

# 统计落在各个区间的值数量
pd.value_counts(cats)


# In[5]:

# 设置区间数学符号
pd.cut(ages,bins,right=False)


# In[6]:

# 设置自己想要的面元名称
group_names = ['Youth','YoungAdult','MiddleAged','Senior']
pd.cut(ages,bins,labels=group_names)


# In[7]:

# 向cut传入面元的数量,则会根据数据的最小值和最大值计算等长面元
data = np.random.rand(20)
pd.cut(data,4,precision=2)  # precision=2表示设置的精度


# In[8]:

# qcut可以根据样本分位数对数据进行面元划分
data = np.random.randn(1000)  # 正态分布
cats = pd.qcut(data,4)       # 按四分位数进行切割
print(cats)


# In[9]:

pd.value_counts(cats)


# In[10]:

# 通过指定分位数(0到1之间的数值,包含端点)进行面元划分
pd.qcut(data,[0,0.1,0.5,0.9,1])

你可能感兴趣的:(135、pandas操作——离散化和面元划分)