如何将duration列按三等分区间划分为short/medium/long三类
实现duration列三等分类(等宽区间)
你的duration列当前是分:秒格式的字符串类型,无法直接做区间划分,先转成数值再做等宽分箱即可,完整流程如下:
操作步骤
- 将时长字符串转换为可计算的数值(统一转为总秒数,避免格式解析错误)
- 调用pandas等宽分箱方法,将数值范围平均拆分为3个区间
- 按区间从短到长依次映射为
short、medium、long三个分类值
完整代码
# 1. 把MM:SS格式的字符串转为总秒数(数值型) df['duration_sec'] = df['duration'].apply( lambda x: int(x.split(':')[0]) * 60 + int(x.split(':')[1]) ) # 2. 等宽拆分为3个区间,打分类标签 df['duration_type'] = pd.cut( df['duration_sec'], bins=3, labels=['short', 'medium', 'long'] ) # 不需要中间计算列的话可以直接删除 # df.drop(columns='duration_sec', inplace=True)
说明
这里用
pd.cut实现等宽分箱:传入bins=3时,会自动取duration_sec列的最小值和最大值作为总区间端点,把总长度平均切分为3份,完全匹配你要的「按取值范围拆分为3个等大小区间」的要求。
注意不要和等频分箱的pd.qcut混淆,pd.qcut是让每个区间的样本数量尽量一致,不是区间大小相等。
可以用下面的代码验证分箱结果:
# 查看每个分类的样本数量 print(df['duration_type'].value_counts()) # 查看实际的分箱边界 temp_bins = pd.cut(df['duration_sec'], bins=3) print("分箱区间边界:", temp_bins.cat.categories)
结合你给出的样例数据,最短时长是48秒(00:48),最长是100秒(01:40),实际分箱区间大概为:
- short:48秒 ~ 65.3秒(对应约00:48~01:05的时长)
- medium:65.3秒 ~ 82.7秒(对应约01:05~01:23的时长)
- long:82.7秒 ~ 100秒(对应约01:23~01:40的时长)
内容的提问来源于stack exchange,提问作者kalkidan Asmare
相关产品推荐
相关产品推荐

