pandas利用pd.cut进行数值型数据分组

在对数据进行处理分析时,有时需要对csv等表格数据中的某列数据进行分组,或者按数值大小重新分为几个类别,如需要将班级学生的成绩按<60,60-75,75-90,>90分为不及格,中,良,优四个等级,就可以利用python中的pandas工具,即pd.cut进行处理。

我们先通过一个实例来简单看看。abc这列数据的数值在 [ 0.01, 0.990 ] 区间内,按数值大小分为5个类别,分类之后的标签用'a', 'd', 'c', 'd', 'e'表示。

import pandas as pd     # 导入需要用到的包pandas

# 读取csv数据
df = pd.read_csv(r'F:\python\temp.csv')

# 读取需要进行分组的某列
df1 = df['abc']
df2 = df['sdf']
df3 = df['dgd']
df4 = df['mjh']
df5 = df['bq']

bins = [0,0.2,0.4,0.6,0.8,1]   # bins是进行分组的依据,取整数,标量序列或者间隔索引
labels=['a','b','c','d','e']   # 分组对应的标签,比bins少一个

# 使用pandas中的cut进行数值分组
df1 = pd.cut(df1,bins=bins,labels=labels)

# 分组之后类别dtype变为'category',如果需要写入csv中需要变为'str'字符串类型
df1 = pd.DataFrame(df1, dtype='str')

# 将分组之后的新标签写入数据中,利用pd.concat进行拼接合并,axis=1表示左右拼接
df = pd.concat([df1, df2,df3,df4,df5],axis=1)

# 写入csv文件
df.to_csv(r'F:\temp.csv',index= False, header= False)

下面是关于函数的具体介绍。

pandas.cut(x, bins, right=True, labels=None, 
           retbins=False, precision=3, include_lowest=False,
           duplicates='raise', ordered=True)
  • x:输入数组必须是一维的

  • bins分组的依据可以是整数(int),标量序列或间隔索引。

① 整数,表示将x中的数值分成等宽的n份(即每一组内的最大值与最小值之差约相等);

② 标量序列,序列中的数值表示用来分档的分界值;

③ 间隔索引,' bins' 的间隔索引必须不重叠。

  • right分箱是否包含最右边。bool布尔值,默认为True

① right = True, bins = [1, 2, 3, 4]表示 (1,2], (2,3], (3,4],区间为左开右闭。

② 当 bins 是间隔索引时,忽略此参数。

  • labels指定返回的箱的标签。数组或 False,默认值为“None”。

① 如果是数组,长度要与分箱个数一致,比如 bins =[1, 2, 3, 4] 表示 (1,2], (2,3], (3,4],一共3个区间,则labels的长度也就是标签的个数也要是3。

② 如果为False,则仅返回分箱的整数指示符,即 x 中的数据在第几个箱子里。

③ 当bins是间隔索引时,将忽略此参数。

  • retbins:是否显示分箱的分界值。bool布尔值,默认值为 False。

当bins取整数时可以设置retbins=True以显示分界值,得到划分后的区间。

  • precision:存储和显示分箱标签的精度。整数,默认值为3。

  • include_lowest:表示区间的左边是开还是闭布尔值,默认为false,也就是不包含区间左边。

  • duplicates:如果分箱临界值不唯一,则引发ValueError或丢弃非唯一。

  • ordered:标签是否排序。bool布尔值,默认值为True

适用于返回的类型分类和系列(具有分类 dtype)。如果为True, 生成的分类将被排序。如果为 False,则结果为分类将是无序的(必须提供标签)。

返回 return

  • 输出output:一个类似数组的对象,表示每个值的相应箱的 x。类型取决于labels的值。Categorical, Series, 或ndarray。

① None (默认值):返回系列 x 的系列或所有其他输入的分类。以间隔类型的值存储。

② 标量序列:返回序列 x 或 所有其他输入的分类。以序列中的任何类型的值存储。

③ False : 返回整数数组。

  • bins:计算或指定的箱。numpy.ndarray 或 IntervalIndex。

仅当 retbins=True 时才返回。 对于标量或序列bins,这是一个具有计算bins。如果设置duplicates=drop,则bins将删除非唯一bins。如果是一个间隔索引 bins,则等于bins

笔记

结果中的任何 NA 值都将为 NA。越界值将在 NA 中 生成的系列或分类对象。

参考网页:

怎样用python pandas对数值型字段进行分组?

pandas.cut

数据分箱之pd.cut()

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: pandascut方法可以将连续的数值数据离散化为离散的数据,即将一段连续的数值范围划分为若干个离散的区间,每个区间代表一个离散的值。cut方法的参数包括要离散化的数据、划分区间的方式(如等距划分、等频划分等)、划分的区间数等。cut方法返回一个Series对象,其每个元素代表原始数据对应的离散值。离散化可以使数据更易于理解和分析,也可以减少数据的噪声和异常值的影响。 ### 回答2: Pandascut方法可以将连续数值数据转换成离散数据,使得数据的处理更具有可操作性。cut方法将一组数据分成多个离散化的区间,每个区间用一个标签代表,同时也可以指定每个区间区间宽度、区间边界以及区间标签名称等参数。 cut方法的基本使用方式是:pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False) 其,x代表需要离散化处理的数据,bins是用来离散化的区间,right参数代表区间是否包含右端点,labels参数可以指定标签名称,retbins参数表示是否需要返回区间边界,precision参数用来表示小数点的保留位数,最后include_lowest参数表示是否需要包含最小值。 例如,以下代码: import pandas as pd import numpy as np data = np.array([0.5, 1.3, 2.7, 6.0, 7.6, 8.9, 10.1]) bins = [0, 2, 5, 8, 10] cuts = pd.cut(data, bins) print(cuts) 输出结果如下: [(0, 2], (0, 2], (2, 5], (5, 8], (5, 8], (8, 10], (8, 10]] Categories (4, interval[int64]): [(0, 2] < (2, 5] < (5, 8] < (8, 10]] 其cuts代表生成的离散化结果,最后一行的Categories表示生成了四个区间区间分别是(0, 2]、(2, 5]、(5, 8]、(8, 10],裁剪结果也用这四个区间代表。可以看到,结果是一个pandas.Categorical变量,其包含这些标签和离散化的数值cut方法还可以根据数据的分布情况和需要,自定义区间宽度、边界和标签名称,更加符合实际需要。例如,以下代码: bins = [0, 2, 5, 8, 10] # 自定义区间边界 labels = ['low', 'middle', 'high', 'highest'] # 自定义标签名称 cuts = pd.cut(data, bins=bins, labels=labels) print(cuts) 最后的结果如下: [low, low, middle, high, high, highest, highest] Categories (4, object): [low < middle < high < highest] 具体来说,以上代码的bins参数设置了离散化的区间边界;labels参数设置了标签名称,并且数据可以被离散化成low、middle、high、highest四个类别;最后得到的结果也是一个pd.Categorical变量,其包含了四个类别的标签名称和对应的离散化的数值。 总的来说,cut方法非常方便地完成了数值数据到离散数据的转换,有效地提升了数据的处理和分析能力。 ### 回答3: Pandas是一个强大的数据分析工具,可以处理各种类数据。离散化是数据预处理过程常用的一种方式,可以将连续的数据集合划分为有限的离散数据集合,方便进行分析和处理。在Pandas利用cut方法可以很方便地进行数据离散化。 cut方法的基本语法如下: pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates=’raise’) 参数说明: x:待离散化的数据。 bins:指定分割点,可以是一个整数、一组分割点或者是无穷大的标量。 right:是否包括最右边的间隔。 labels:分割后的标签,可以是一组字符串或者是自定义函数。 retbins:是否返回间隔标签。 precision:十进制小数的精度。 include_lowest:是否把最小值包括在内,默认不包括。 duplicates:超出边缘范围的处理方式。raise:不允许超出范围的值出现;drop:把超出范围的值从分析删除;等等。 使用cut方法进行数据离散化的步骤如下: 1.导入Pandas库。 2.读取数据。 3.指定分割点,使用cut方法对数据进行处理。 4.分析处理后的数据Pandascut方法可用于单个或多个连续值的区间化。cut()使用一个数组作为第一个参数,把它分割为一些称为“桶”的间隔值。例如,将1到100按照10个区间划分,每个区间为10,就可以分为[1,11),[11,21),... [91,101)。其,左闭右开的区间可以通过设置right=False进行修改。而标签可以通过传递标签列表或数组以及等量的字符串标签生成,这可以调动于设置labels选项。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值