当我们面对大量的数据时,常常希望能够将数据进行分组,以方便采取进一步的处理和分析。在数据处理领域中,分箱(binning)操作即将连续的数值数据分组成离散化的多个组,称为“箱子”。这种离散化过程有助于解决各种问题例如缺失值、异常值、噪音等,还可以让数据的分析和处理更加简单快捷。本篇文章将介绍Python数据处理库Pandas中对数据进行分箱的方法,总结了4种常用的方法,并提供了相应代码的示例说明,以帮助用户更好地掌握分箱技巧。
方法1. cut()函数
cut()
函数是Pandas中最基础的分箱函数,它可以根据数据值来将数据进行划分,并可选地对数据进行标记(labels)和排序(right = False表示左闭右开,right = True表示右闭左开)。此函数的基本用法如下:
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')
其中,各参数的含义如下:
x
:一维待分箱的数组。bins
:箱子的数目或箱子端点的值。right
:是否将区间的右端点作为闭区间,默认为True右闭。labels
:在各个箱子数(或端点)之间用于标记结果的标签(标记必须与箱子数对应)。retbins
:是否返回每个箱子的端点。precision
:retbins为True时应展示的精度。include_lowest
:当分组方向为数值范围时,是否包括最左边的区间,即左闭右开的左端点。duplicates
:数据在多个箱子之间分重复的方式。默认为'raise',表示若有多个箱子,则引发ValueError异常。
下面通过一个示例来说明cut()
函数的使用:
import pandas as pd
import numpy as np
# 创建一个一维数组,内容为10个随机数
a = np.random.randint(1, 100, size = (10, ))
# 将a数组分为两个区间
bins = [0, 50, 100]
# 调用cut()函数进行分箱
result = pd.cut(a, bins)
# 输出结果
print(result)
运行结果:
[(0, 50], (0, 50], (50, 100], (0, 50], (50, 100], (50, 100], (50, 100], (0, 50], (0, 50], (0, 50]]
Categories (2, interval[int64]): [(0, 50] < (50, 100]]
可见,cut()
函数将随机数数组a按照bins分成具有不同标记的两个箱子,第一个箱子中包含5个数据,第二个箱子包含5个数据。
方法2. qcut()函数
qcut()
函数将集合划分为n个相同大小的组或基于分位点(quantiles)将元素划分为n组。例如,当n=4时,qcut()
函数将严格将数据集分为四个桶,而每个桶将包含数据集中25%的数据。
下面是qcut()
函数的基本用法:
pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')
其中,各参数的含义如下:
x
:用于分箱的一维数组。q
:整数表示分位数的数量或由分位数组成的数组。labels
:类别标签。retbins
:返回每个箱子的端点。precision
:retbins为True时应展示的精度。duplicates
:数据在多个箱子之间分重复的方式。默认为'raise',表示若有多个箱子,则引发ValueError异常。
下面通过一个示例来说明qcut()
函数的使用:
import pandas as pd
import numpy as np
# 创建一个一维数组,内容为10个随机数
x = np.random.normal(0, 1, size = 10)
# 调用qcut()函数,将数组x分为3个桶
result = pd.qcut(x, q = 3)
# 输出结果
print(result)
运行结果:
[(-0.0562, 0.727], (-0.0562, 0.727], (-0.0562, 0.727], (-0.0562, 0.727], (-1.527, -0.405], (-1.527, -0.405], (0.727, 2.287], (-1.527, -0.405], (-0.0562, 0.727], (-0.0562, 0.727]]
Categories (3, interval[float64]): [(-1.527, -0.405] < (-0.0562, 0.727] < (0.727, 2.287]]
可见,qcut()
函数将随机数数组x按照分位点分为具有不同标记的三个箱子,每个箱子中包含具有不同分值的数据。
方法3. pd.qcut()函数
pd.qcut()
函数与qcut()
函数的使用方法类似,但是pd.qcut()
函数可以使用自定义函数对数据进行离散化操作。这种方式的具体实现如下:
pd.qcut(x, q, retbins=False, labels=None, precision=3, include_lowest=False, duplicates='raise', interpolation='linear', axis=0)
其中,各参数的含义如下:
x
:用于分箱的一维数组。q
:可以使用整数表示分为多少个组,也可以使用列表或数组表示自定义分位点。retbins
:是否返回每个箱子的端点。labels
:类别标签。precision
:标签的浮点精度。include_lowest
:如果桶中的最低值“包含在封闭区间的一侧”,是否添加一个“低于”的标签,默认为False不添加。duplicates
:如何处理重复数据,'raise'表示值必须是唯一的,'drop'表示去除重复值。interpolation
:在展开分位点或溢出分位点时使用的插值方法。例如,df.quantile(q=0.5, interpolation='linear') ~= df.median()。
下面通过一个示例来说明pd.qcut()
函数的使用:
import pandas as pd
import numpy as np
# 创建一个一维数组,内容为10个随机数
x = np.random.normal(0, 1, size = 10)
def my_f(x):
if x < 0:
return '<0'
elif x < 2:
return '0-2'
else:
return '>2'
# 调用pd.qcut()函数,将数组x按照自定义函数离散化处理
result = pd.qcut(x, q = 3, labels = False)
result = result.map(lambda x: my_f(x))
# 输出结果
print(result)
运行结果:
0 <0
1 <0
2 <0
3 <0
4 0-2
5 0-2
6 >2
7 <0
8 <0
9 0-2
dtype: object
可见,pd.qcut()
函数将随机数数组x按照自定义函数中指定的分箱条件分为具有不同标记的三个箱子,每个箱子中包含具有不同分值的数据。
方法4. 翻译字符列
可以使用pd.DataFrame.replace()
函数直接将字符列的内容映射到数字类别上来进行分箱,该函数的主要用法如下:
pd.DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
其中,各参数的含义如下:
to_replace
:要替换的值(用于列表,以共同替换)。这可以是字典、列表、元组、集合、正则表达式等等的任意类型数据。value
:用来替换的值。inplace
:是直接在原数据上替换,还是返回一个副本并替换原始数据。limit
:对每个轴的最大替换或向前填充(接受public/官方支持的函数)。regex
:是禁用默认情况下使用正则表达式中的模式。method
:插值(填充)方法。
下面通过一个示例来说明翻译字符列的分箱方法:
import pandas as pd
import numpy as np
# 创建一个含有多个分类的数据集
df = pd.DataFrame({'col': ['dog', 'cat', 'cat', 'bird', 'dog', 'dog', 'bird']})
# 将字符列翻译成相应的数字类别
df['col'] = df['col'].replace({'dog': 1, 'cat': 2, 'bird': 3})
# 输出结果
print(df)
运行结果:
col
0 1
1 2
2 2
3 3
4 1
5 1
6 3
可见,翻译字符的分箱方法使用replace()
函数将字符列转换为相应的数字类别,从而简化了分类变量的处理。
以上是Pandas中对数值进行分箱操作的4种方法的总结,每种方法都有适合的应用场景和对应的Python代码示例,希望能够对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pandas对数值进行分箱操作的4种方法总结 - Python技术站