如何将字典多个值传入函数实现pandas批量时间分箱与分组处理
问题修复与优化实现
1 现有代码问题修正
- 函数未接收
apply传入的行参数,错误调用全局row、df变量存在作用域风险 - 标签列表重复定义
fifteen_days_before,第10个标签应为fifteen_days_after - 每次执行函数都重复读取
patient_dict字典值,存在不必要的性能损耗
2 高效传参+逐行处理方案
如果需要保留apply的逐行处理逻辑,可通过偏函数提前绑定固定参数,避免重复读取字典与全局变量污染:
import pandas as pd from functools import partial # 仅执行一次字典值提取,预处理为pd.cut要求的单调递增日期序列 bins = sorted([dt.date() for dt_group in patient_dict.values() for dt in dt_group]) # 修正后的标签列表 labels = [ '30_days_before','fifteen_days_before','seven_days_before','three_days_before', 'one_day_before','app_day','one_day_after','three_days_after', 'seven_days_after','fifteen_days_after', '30_days_after','Out-Of-Bounds' ] # 定义无全局变量依赖的映射函数 def time_mapping(row, bins, labels): return pd.cut(row.eventDTTM.date(), bins=bins, labels=labels, right=False) # 绑定固定参数后传入apply mapping_func = partial(time_mapping, bins=bins, labels=labels) df['time_bin'] = df.apply(mapping_func, axis=1)
3 更高性能的向量化方案(推荐)
apply逐行迭代性能较低,数据量超过1万行时建议直接用pandas向量化操作,效率提升10倍以上:
# 批量转换日期格式 df['event_date'] = df['eventDTTM'].dt.date # 全局执行分箱,无需逐行处理 df['time_bin'] = pd.cut(df['event_date'], bins=bins, labels=labels, right=False)
注意事项
pd.cut要求分箱边界bins的数量比标签labels少1,当前标签共12个,需确保预处理后的bins长度为13,若边界不足可手动在首尾补充日期极值适配。
内容的提问来源于stack exchange,提问作者nhoang
相关产品推荐
相关产品推荐

