如何简化Python Pandas视频时长分类代码,减少冗余?
Pandas视频时长区间划分代码优化方案
原代码的问题点
- 重复调用
df_preroll.loc赋值,多次遍历DataFrame,运行效率偏低 - 空值判断逻辑错误:Pandas中缺失值(NaN)不能用
== None判断,需用pd.isna()或df.isnull()
优化方案
方法1:使用pd.cut(推荐,效率最高)
pd.cut是Pandas专为数值区间划分设计的函数,可一次性完成所有区间赋值,无需多次遍历:
import pandas as pd # 定义区间边界与对应标签 bins = [0, 6, 14, 29, float('inf')] labels = ['0-6', '7-14', '15-29', '30+'] # 执行区间划分,空值自动保留为NaN df_preroll['Video_Length_Bracket'] = pd.cut( df_preroll['Video length'], bins=bins, labels=labels, include_lowest=True # 确保左边界0被包含,匹配原代码>0且<=6的逻辑 )
说明:
include_lowest=True让区间左闭右开的特性适配原代码的0 < x <=6逻辑- 空值会被自动处理为NaN,无需额外赋值操作
方法2:使用np.select(灵活性更强,适配复杂条件)
如果需要自定义更复杂的区间规则,可使用np.select一次性完成条件映射:
import numpy as np # 定义条件列表与对应结果 conditions = [ (df_preroll['Video length'] > 0) & (df_preroll['Video length'] <= 6), (df_preroll['Video length'] >= 7) & (df_preroll['Video length'] <= 14), (df_preroll['Video length'] >= 15) & (df_preroll['Video length'] <= 29), df_preroll['Video length'] >= 30 ] choices = ['0-6', '7-14', '15-29', '30+'] # 赋值,未匹配条件的空值自动设为NaN df_preroll['Video_Length_Bracket'] = np.select(conditions, choices, default=np.nan)
空值处理的正确方式
原代码中df_preroll.loc[(df_preroll['Video length'] == None), ...]的判断逻辑错误,正确的空值检查应使用:
# 检测空值 df_preroll['Video length'].isna()
上述两种优化方案已自动处理空值,无需额外执行空值赋值操作。
内容的提问来源于stack exchange,提问作者PiCubed
相关产品推荐
相关产品推荐

