在Python中基于多条件计算行程终点的条件概率
多条件下终点到达的条件概率计算方法
要计算给定星期几(day_of_week)和时段(period_of_day)时,到达指定终点(end_point)的条件概率(即$P(end_point | day_of_week, period_of_day)$),可以用以下两种简洁的实现方式:
方法一:直接分组归一化计数
这是最直观的方式,通过按两个条件分组后,直接计算组内各终点的占比:
# 按星期几+时段分组,计算组内各终点的归一化占比(即条件概率) cond_prob = df.groupby(['day_of_week', 'period_of_day'])['end_point'].value_counts(normalize=True) # 可选:调整索引顺序,让end_point作为第一级索引,和你原单条件结果格式对齐 cond_prob = cond_prob.swaplevel(0, 2).sort_index()
执行后结果示例(对应你的测试DataFrame):
end_point day_of_week period_of_day Station_1 0 afternoon 1.000000 2 morning 1.000000 Station_2 0 night 0.500000 1 evening 1.000000 1 noon 1.000000 Station_3 0 night 0.500000 1 morning 1.000000 dtype: float64
方法二:分步计算联合计数与条件总计数
如果你想沿用原单条件的分步思路,可以先统计联合出现次数,再除以对应条件的总行程数:
# 1. 统计(end_point, day_of_week, period_of_day)的联合出现次数 joint_counts = df.groupby(['end_point', 'day_of_week', 'period_of_day']).size() # 2. 统计(day_of_week, period_of_day)组合的总行程数 cond_total = df.groupby(['day_of_week', 'period_of_day']).size() # 3. 计算条件概率:联合计数除以对应条件的总行程数 cond_prob = joint_counts / cond_total.reindex(joint_counts.index.droplevel(0))
这个方法得到的结果和方法一完全一致,适合需要明确拆解计算逻辑的场景。
结果验证示例
比如测试DataFrame中:
- 当
day_of_week=0且period_of_day=night时,共有2条行程,终点分别是Station_2和Station_3,因此两者的条件概率各为0.5,和结果一致。 - 当
day_of_week=1且period_of_day=noon时,只有1条行程,终点为Station_2,因此概率为1.0,符合预期。
内容的提问来源于stack exchange,提问作者user14738548
相关产品推荐
相关产品推荐

