Python实现相同数据分箱:手动算法与pandas.cut方法详解
本文介绍Python中对相同数据进行分箱处理的两种方法。首先通过手动遍历算法,将连续或分类数据按相同值分组,旨在减少全量遍历带来的IO开销并提升运行速度。其次演示利用pandas库的cut函数进行区间分箱及标签映射。内容涵盖数字与元组类型的处理逻辑,适用于需要优化遍历性能或进行数据离散化的场景。
前言
博主在近期工作中遇到了数据分箱的需求,即对相同数据进行遍历比较,从而避免对所有数据进行全量遍历。这一操作显著降低了计算机的IO次数,有效提升了程序的运行速度。在查阅大量技术博文后未找到直接解决方案,因此整理并分享个人的解决思路。
什么是分箱?
简而言之,分箱是将不同数据根据特定条件放入指定容器的过程。例如,将绿色水果放入一个篮子,红色水果放入另一个篮子。这里的“篮子”即为箱,“水果”代表数据,而“颜色”则是划分条件。
什么样式的数据要进行分箱
数据主要可分为连续变量和分类变量。分箱操作主要针对连续变量,但也可应用于具有相同特征值的分类数据。
为什么要对数据进行分箱操作
进行数据分箱的主要目的包括:提高模型的稳定性、降低时间复杂度、使数据结构更清晰易读,以及提高预测或处理的准确度。
思路
算法逻辑如下:首先将列表的第一个元素赋值给变量last,并将其存入临时列表temp中。随后,从列表的第二个元素开始,将其与last进行比较。如果两者相同,则将该元素追加到temp列表中;如果不同,则执行后续步骤。
当发现数据与last不同时,将last更新为这个不同的数值并存入新的temp列表,同时将之前的temp列表追加到一个空的主列表中,以此完成一个分箱的存储。
类型一:数字
实现效果
[1,1,1,2,2,2,3,3,4,4,5,5,5,5,5]
# 转变为
[[1, 1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5, 5, 5]]
代码实现
box = [1,1,1,2,2,2,3,3,4,4,5,5,5,5,5]
last = box[0]
temp = [box[0]]
box_list = [temp]
for a in box[1::]:
if a == last:
temp.append(a)
else:
last = a
temp = [a]
box_list.append(temp)
print(box_list) # [[1, 1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5, 5, 5]]
# 实现按每一个分箱列表遍历数据(而不用全部遍历)
for boxs in box_list:
for i in boxs:
print(i)
类型二:元组
实现效果
box = [('小黑','20','四川'),('小黑','21','北京'),('张三','18','上海'),('张三','22','上海'),('张三','30','北京'),('李四','10','广州')]
# 实现把名字相同的元组放入一个列表
[[('小黑', '20', '四川'), ('小黑', '21', '北京')], [('张三', '18', '上海'), ('张三', '22', '上海'), ('张三', '30', '北京')], [('李四', '10', '广州')]]
代码实现
box = [('小黑','20','四川'),('小黑','21','北京'),('张三','18','上海'),('张三','22','上海'),('张三','30','北京'),('李四','10','广州')]
last = box[0][0]
temp = [box[0]]
box_list = [temp]
for a in box[1::]:
if a[0] == last:
temp.append(a)
else:
last = a[0]
temp = [a]
box_list.append(temp)
print(box_list)
# 实现按每一个分箱列表遍历数据(而不用全部遍历)
for boxs in box_list:
for i in boxs:
print(i[0]) # 0取的姓名,1取年龄,3取地址
附:利用Python的cut方法可以对数据进行分箱。
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
# 随机生成一组数据
score_list = np.random.randint(25,100,size = 20) # 随机生成最小值25,最大值100的20个数据
# 分箱的区间
bins = [0,59,70,80,100]
# 分箱
score_cat = pd.cut(score_list,bins)
# 统计不同区间的个数
pd.value_counts(score_cat)
# 生成一个空的DataFrame
df = DataFrame()
df['Score'] = score_list
df['Name'] = [pd.util.testing.rands(5) for i in range(20)] # 生成20个姓名
df['Categories'] =pd.cut(df['Score'],bins,labels = ['不及格','一般','优秀','厉害'])
# labels对应的是bins的总结
到此这篇关于Python实现对相同数据分箱的文章就介绍到这了,更多相关Python相同数据分箱内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









