如何按年份和地区分组计算均值并为多边形构建生成循环索引

发布时间 - 2026-02-02 00:00:00    点击率:

本文介绍如何在 pandas 中对时间-区域分组数据计算每组 `var` 的平均值,并按特定顺序(lower 升序、upper 降序)为每组分配循环编号,以支持后续多边形坐标连接(如绘制上下包络线)。

在地理可视化或统计图表(如带状图、置信区间填充多边形)中,常需将成对的“下界”和“上界”数据点按空间/时间逻辑首尾相连构成闭合多边形。本教程解决两个核心任务:

  1. 按 year 和 region 分组计算 var 的均值,并广播至每行;
  2. 为每组(同一 region)内所有记录分配 loop 编号,使其排序后形成 lower→lower→upper→upper 的“Z 字形”连接顺序(即:先按年份升序排 lower,再按年份降序排 upper),从而自然构成闭合环路(0→1→2→3→0)。

以下为完整实现步骤:

✅ 步骤 1:构造示例数据

import pandas

as pd mydict = { 'year': [2010, 2010, 2011, 2011, 2010, 2010, 2011, 2011], 'region': [1, 1, 1, 1, 2, 2, 2, 2], 'group': ['lower', 'upper', 'lower', 'upper', 'lower', 'upper', 'lower', 'upper'], 'var': [10, 20, 30, 40, 50, 60, 70, 80] } df = pd.DataFrame(mydict)

✅ 步骤 2:添加 average 列(组内均值)

使用 transform('mean') 确保结果与原始 DataFrame 行数对齐:

df['average'] = df.groupby(['year', 'region'])['var'].transform('mean')

✅ 步骤 3:生成 loop 列(多边形顶点序号)

关键在于自定义排序逻辑

  • 所有 'lower' 行按 year 升序排列(即 var 自然升序,因题设 lower
  • 所有 'upper' 行按 year 降序排列(即 var 降序 → 可通过取负值实现统一升序排序)。

实现方式如下:

df['loop'] = (
    df.assign(var=df['var'].mask(df['group'] == 'upper', -df['var']))
      .sort_values(by=['group', 'var'])
      .groupby('region').cumcount()
)

✅ 解析:

  • df.assign(...) 临时将 upper 组的 var 替换为负值,使排序时 upper 行按原 year 降序呈现;
  • sort_values(['group', 'var']) 先按 'lower'/'upper' 分组,再按(修正后)var 排序 → 实现 lower(2010)→lower(2011)→upper(2011)→upper(2010);
  • groupby('region').cumcount() 对每个 region 内排序后的行从 0 开始编号,完美匹配目标 loop 序列。

✅ 最终结果验证

print(df.sort_values(['region', 'year', 'group']).reset_index(drop=True))

输出符合预期:

   year  region  group  var  average  loop
0  2010       1  lower   10     15.0     0
1  2010       1  upper   20     15.0     3
2  2011       1  lower   30     35.0     1
3  2011       1  upper   40     35.0     2
4  2010       2  lower   50     55.0     0
5  2010       2  upper   60     55.0     3
6  2011       2  lower   70     75.0     1
7  2011       2  upper   80     75.0     2

⚠️ 注意事项

  • 该方法依赖题设前提:同一年份-地区内,lower 的 var 值恒小于 upper。若数据不满足,需改用显式 year 列排序(如 sort_values(['region', 'group', 'year'], key=lambda x: x if x.name != 'year' or x.name == 'group' else (-x if x.name=='year' and df['group']=='upper' else x)));
  • loop 列本质是每 region 内的局部序号,若需全局唯一 ID,可叠加 region 编码(如 df['region']*100 + df['loop']);
  • 此序号可直接用于 matplotlib.patches.Polygon 或 geopandas.GeoDataFrame 构建闭合面,例如:按 loop 升序提取 (var, year) 坐标列表,首尾自动闭合。

通过以上方法,你即可高效生成兼具统计意义与几何结构的结构化数据,为动态区间可视化打下坚实基础。


# go  # 编码  # 统计图表  # 排列  # pandas  # matplotlib  # if  # 循环  # Lambda  # var  # transform  # 升序  # 降序  # 每组  # 再按  # 首尾相连  # 均值  # 将成  # 自定义  # 使其  # 区内 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在阿里云ECS服务器部署织梦CMS网站?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Firefox Developer Edition开发者版本入口  如何自定义建站之星模板颜色并下载新样式?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  ,网页ppt怎么弄成自己的ppt?  5种Android数据存储方式汇总  如何在云主机上快速搭建网站?  如何在云主机快速搭建网站站点?  怎么用AI帮你设计一套个性化的手机App图标?  Android自定义控件实现温度旋转按钮效果  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  高防服务器租用首荐平台,企业级优惠套餐快速部署  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何在建站之星绑定自定义域名?  如何在局域网内绑定自建网站域名?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel Session怎么存储_Laravel Session驱动配置详解  如何快速生成橙子建站落地页链接?  Bootstrap CSS布局之列表  Android自定义listview布局实现上拉加载下拉刷新功能  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel如何实现文件上传和存储?(本地与S3配置)  如何在云虚拟主机上快速搭建个人网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  详解Android图表 MPAndroidChart折线图  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  如何快速生成专业多端适配建站电话?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  如何获取PHP WAP自助建站系统源码?  如何在Windows虚拟主机上快速搭建网站?  Python面向对象测试方法_mock解析【教程】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  如何用西部建站助手快速创建专业网站?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  linux top下的 minerd 木马清除方法  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  南京网站制作费用,南京远驱官方网站?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  如何在景安云服务器上绑定域名并配置虚拟主机?