按出发小时分组的旅行距离直方图:如何获取各直方图的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
相关产品推荐
相关产品推荐

