如何按年份和地区分组计算均值并为多边形构建生成循环索引
发布时间 - 2026-02-02 00:00:00 点击率:次本文介绍如何在 pandas 中对时间-区域分组数据计算每组 `var` 的平均值,并按特定顺序(lower 升序、upper 降序)为每组分配循环编号,以支持后续多边形坐标连接(如绘制上下包络线)。
在地理可视化或统计图表(如带状图、置信区间填充多边形)中,常需将成对的“下界”和“上界”数据点按空间/时间逻辑首尾相连构成闭合多边形。本教程解决两个核心任务:
- 按 year 和 region 分组计算 var 的均值,并广播至每行;
- 为每组(同一 region)内所有记录分配 loop 编号,使其排序后形成 lower→lower→upper→upper 的“Z 字形”连接顺序(即:先按年份升序排 lower,再按年份降序排 upper),从而自然构成闭合环路(0→1→2→3→0)。
以下为完整实现步骤:
✅ 步骤 1:构造示例数据
import pandasas 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队列驱动与任务分发实例
如何在景安云服务器上绑定域名并配置虚拟主机?


