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

按出发小时分组的旅行距离直方图:如何获取各直方图的bin密度值并整理为DataFrame

解决分组直方图密度数据提取并整理为DataFrame的问题

我懂你的困扰:用hist(by=...)画分组直方图时,没法像单个直方图那样直接拿到每个bin的密度值,而你需要把这些数据整理成行是距离区间、列是出发小时的DataFrame。下面是具体的解决方案:

核心思路

hist(by=...)返回的是子图对象数组,而非直方图的统计数据,所以我们换一种方式:先统一所有分组的距离区间(bins),再按Departuretime分组计算每个组在对应区间的密度值,最后整理成目标格式的DataFrame。

具体代码实现

1. 导入依赖并准备统一的bins

首先确保所有分组用相同的bins计算密度,这样不同小时的数据能完美对齐:

import pandas as pd
import numpy as np

# 方法1:基于全局Distance数据自动生成bins(和你原来hist图的bins一致)
_, bins_global = np.histogram(df['Distance'], density=True)

# 方法2:手动指定bins数量(更可控,比如设置为10个区间)
# _, bins_global = np.histogram(df['Distance'], bins=10, density=True)

2. 分组计算每个出发小时的密度值

通过groupby结合自定义函数,计算每个小时分组下的密度数据:

# 定义函数:输入单个分组的Distance数据和统一bins,返回该组的密度数组
def calculate_density(group, target_bins):
    density_values, _ = np.histogram(group, bins=target_bins, density=True)
    return density_values

# 按Departuretime分组,应用函数计算密度
density_series = df.groupby('Departuretime')['Distance'].apply(calculate_density, target_bins=bins_global)

3. 整理为目标格式的DataFrame

把得到的密度数据转换为行是距离区间、列是出发小时的结构:

# 生成bins的区间标签(比如"0.00-5.23"这样的格式)
bin_labels = [f"{bins_global[i]:.2f}-{bins_global[i+1]:.2f}" for i in range(len(bins_global)-1)]

# 转换为DataFrame并调整结构
density_df = pd.DataFrame(density_series.tolist(), index=density_series.index).T
# 设置行索引为区间标签
density_df.index = bin_labels
# 可选:对出发小时列进行排序(因为Departuretime是str类型,确保顺序正确)
density_df = density_df.sort_index(axis=1)

验证结果

现在density_df就是你想要的结构:

  • 每一行代表一个距离区间
  • 每一列对应一个出发小时
  • 单元格值是该小时下对应距离区间的密度

这样你就可以直接用这个DataFrame进行后续的计算和分析了。

内容的提问来源于stack exchange,提问作者Douwe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:07:37