You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字典多个值传入函数实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:15:02