如何在Pandas数据框中按Code分组计算面积的累积百分比
按Code分组计算Dist_km对应面积的累积百分比
嘿,这事儿不难,用Pandas几步就能搞定!我给你捋清楚步骤和代码,你直接套用就行~
先明确需求
你需要对每个code分组,按Dist_km的逻辑顺序(默认是从小到大,毕竟距离区间一般是按近到远划分的),计算每个区间面积占组内总面积的比例,再逐步累积直到占比达到100%。
示例实现步骤
1. 先构造示例数据(你可以替换成自己的真实数据)
import pandas as pd # 模拟你的数据结构 data = { 'code': ['M0017', 'M0017', 'M0017', 'M0017', 'M0023', 'M0023', 'M0023'], 'Dist_km': [0.5, 1.0, 1.5, 2.0, 0.5, 1.0, 1.5], '面积': [20, 30, 40, 10, 25, 50, 25] } df = pd.DataFrame(data)
2. 核心计算代码
# 第一步:按code分组,组内按Dist_km升序排序(这步很关键,保证累积顺序符合逻辑) df_sorted = df.groupby('code').apply(lambda x: x.sort_values('Dist_km', ascending=True)).reset_index(drop=True) # 第二步:计算每个组的面积占比和累积占比 df_result = df_sorted.groupby('code').apply( lambda group: group.assign( # 计算单条面积占组内总面积的百分比 面积占比=lambda g: (g['面积'] / g['面积'].sum()) * 100, # 计算累积面积占比 累积面积占比=lambda g: (g['面积'].cumsum() / g['面积'].sum()) * 100 ) ).reset_index(drop=True) # 可选:如果需要确保只保留到累积占比首次达到100%的行(正常情况下最后一行就是100%) df_result = df_result.groupby('code').apply(lambda g: g[g['累积面积占比'] <= 100]).reset_index(drop=True)
3. 查看结果(以M0017为例)
运行后,M0017组的结果会是这样:
| code | Dist_km | 面积 | 面积占比 | 累积面积占比 |
|---|---|---|---|---|
| M0017 | 0.5 | 20 | 20.0 | 20.0 |
| M0017 | 1.0 | 30 | 30.0 | 50.0 |
| M0017 | 1.5 | 40 | 40.0 | 90.0 |
| M0017 | 2.0 | 10 | 10.0 | 100.0 |
一些注意事项
- 排序不能少:一定要保证每个
code组内的Dist_km是按你需要的顺序排列(比如从小到大),不然累积占比的逻辑就完全错了。 - 适配真实数据:如果你的
面积列是绝对值(不是百分比),代码依然有效,因为全程用组内的总面积作为分母计算占比。 - 控制小数位数:如果需要更精确的小数,比如保留两位,可以在计算时加
round(2),比如(g['面积'] / g['面积'].sum()) * 100).round(2)。
内容的提问来源于stack exchange,提问作者Funkeh-Monkeh
相关产品推荐
相关产品推荐

