pandas 中的面元cut

函数cut

cut函数可以给序列分组,比如把年龄,成绩进行分组,统计不同分组内的人数有多少,等等。
函数结构如下:

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)

x:要分箱的输入数组。它必须是一维的。

bin:int或标量序列
如果bins是一个int,它定义在x范围内的等宽单元的数量。然而,在这种情况下,x的范围在每一侧延伸0.1%以包括x的最小值或最大值。如果bin是一个序列,它定义了允许非均匀bin宽度的bin边缘。在这种情况下不进行x的范围的扩展。

right:bool,可选
决定区间的开闭,如果right == True(默认),则区间[1,2,3,4]指示(1,2],(2,3],(3,4]。

labels:array或boolean,默认值为无
用作生成的区间的标签。必须与生成的区间的长度相同。如果为False,则只返回bin的整数指示符。

retbins:bool,可选
是否返回bin。如果bin作为标量给出,则可能有用。

precision:int
存储和显示容器标签的精度

include_lowest:bool
第一个间隔是否应该包含左边。

代码示例

对学生的成绩grades进行分类。

import numpy as np
from pandas import Series,DataFrame
import pandas as pd
grades = [20, 60, 44, 76, 85 , 99 , 95, 100, 66, 77, 88]
bins = [0, 60, 80, 100.1]
cats = pd.cut(grades, bins, right=False)#左闭右开
print(cats)
count_num = cats.value_counts()
print(count_num)#统计不同区间内的学生人数
print(type(count_num))#Series类
print(count_num.index)

代码结果如下:

[[0.0, 60.0), [60.0, 80.0), [0.0, 60.0), [60.0, 80.0), [80.0, 100.1), ..., [80.0, 100.1), [80.0, 100.1), [60.0, 80.0), [60.0, 80.0), [80.0, 100.1)]
Length: 11
Categories (3, interval[float64]): [[0.0, 60.0) < [60.0, 80.0) < [80.0, 100.1)]
#统计各区间内数量
[0.0, 60.0)      2
[60.0, 80.0)     4
[80.0, 100.1)    5
dtype: int64
<class 'pandas.core.series.Series'>
CategoricalIndex([[0.0, 60.0), [60.0, 80.0), [80.0, 100.1)], categories=[[0.0, 60.0), [60.0, 80.0), [80.0, 100.1)], ordered=True, dtype='category')

注意事项

可以发现,cats.value_counts()返回值是一个Series,它的index很特殊,是这样的:
CategoricalIndex([[0.0, 60.0), [60.0, 80.0), [80.0, 100.1)], categories=[[0.0, 60.0), [60.0, 80.0), [80.0, 100.1)], ordered=True, dtype=’category’)。
如果,某个DF的 index 索引是这种类型的,在使用DF.to_excel()让它生成excel时,会报错,可以把 index 先转化成 str 格式的,再生成excel。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值