Python中是否存在按X区间计算Y值均值的函数/包?(脑容量分析场景)
解决方案:用Pandas实现按时间区间分组求均值
Python里Pandas是处理这类时间序列/分组统计的最优工具,代码简洁、可扩展,完全能替代手动操作,以下是两种适配你需求的常用方法:
方法1:用pd.cut()手动定义时间区间
适合年代数据为数值型的场景(比如用负数表示公元前,如-300000代表30万年前,-100代表100年前):
- 准备示例数据(模拟你的分布不均情况):
import pandas as pd import numpy as np import matplotlib.pyplot as plt np.random.seed(42) # 构造年代数据:远古数据占40%,近千年数据占60% years = np.concatenate([ np.random.randint(-300000, -1000, size=400), np.random.randint(-1000, -100, size=600) ]) # 构造脑容量数据(模拟真实分布) brain_volume = np.random.normal(1350, 100, size=len(years)) df = pd.DataFrame({'year': years, 'brain_volume': brain_volume})
- 按100年区间分组并计算均值:
# 生成100年跨度的区间边界:从-300000到-100,步长100 bins = np.arange(-300000, -100 + 100, 100) # 给每个样本分配区间标签(用区间中点作为标签,方便绘图时定位) df['year_bin'] = pd.cut(df['year'], bins=bins, labels=bins[:-1] + 50) # 按区间分组计算平均脑容量,丢弃无数据的区间 bin_mean = df.groupby('year_bin')['brain_volume'].mean().dropna()
- 绘图展示结果:
plt.figure(figsize=(12, 6)) bin_mean.plot(kind='line', marker='o', color='#2c3e50') plt.xlabel('年代(公元前,年)') plt.ylabel('平均脑容量(cm³)') plt.title('Homo sapiens脑容量随时间变化(每100年平均)') plt.grid(True, alpha=0.3) plt.show()
方法2:用pd.resample()处理时间序列
如果将年代转换为datetime类型(Pandas支持公元前时间戳),可以用更简洁的重采样方法:
- 转换年代为datetime格式:
# 将数值型年代转为datetime(负数值自动识别为公元前) df['datetime'] = pd.to_datetime(df['year'], unit='Y', origin='julian') # 设置datetime为数据索引 df = df.set_index('datetime')
- 按100年区间重采样求均值:
# '100AS'代表100年区间(AS=Anno Domini之前,即公元前) resampled_mean = df['brain_volume'].resample('100AS').mean().dropna()
- 绘图(索引为datetime,可自行格式化显示):
plt.figure(figsize=(12, 6)) resampled_mean.plot(kind='line', marker='s', color='#e74c3c') plt.xlabel('年代') plt.ylabel('平均脑容量(cm³)') plt.title('Homo sapiens脑容量随时间变化(每100年平均)') plt.grid(True, alpha=0.3) plt.show()
扩展优势
- 灵活调整区间:只需修改
bins步长(方法1)或resample频率参数(比如'50AS'代表50年区间),无需重构分组逻辑。 - 高效处理大数据:Pandas的分组、重采样都是向量化操作,比手动循环效率高几个数量级,数据集扩大后依然能快速运行。
- 兼容后续分析:分组结果可直接对接变点分析工具(如
ruptures包),无需额外格式转换。
内容的提问来源于stack exchange,提问作者Code_monkey
相关产品推荐
相关产品推荐

