You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按条件Groupby聚合:统计各区域设施构建状态数量

Pandas实现按Sector聚合不同用途与状态的计数需求

嘿,我来帮你搞定这个Pandas的聚合计数需求!先把你的原始数据转换成可运行的Pandas DataFrame代码:

import pandas as pd

# 原始输入数据
raw_data = {
    'Sector': ['SE1']*6 + ['SE2']*6,
    'Plot': [1,2,3,4,5,6]*2,
    'Usage': ['Garden','School','Garden','School','Garden','School',
              'School','School','Garden','School','School','School'],
    'Status': ['Constructed','Constructed','Not_Constructed','Constructed',
               'Not_Constructed','Not_Constructed','Constructed','Constructed',
               'Constructed','Constructed','Not_Constructed','Not_Constructed']
}
df = pd.DataFrame(raw_data)

接下来我提供两种基于Pandas分组聚合的实现方法,你可以根据自己的习惯选择:

方法一:用pd.crosstab快速实现

这种方法最简洁,利用交叉表直接统计分组后的组合计数,再调整列名就能得到目标结果:

# 生成Sector、Usage、Status的交叉计数表
cross_table = pd.crosstab(df['Sector'], [df['Usage'], df['Status']])

# 重命名列,匹配目标格式
cross_table.columns = [
    f"N_of_{usage}_{status.replace('_', '')}"
    for usage, status in cross_table.columns
]

# 重置索引,让Sector成为普通列
result = cross_table.reset_index()

# 查看最终结果
print(result)

输出的结果完全符合你的目标DataFrame:

Sector  N_of_Garden_Constructed  N_of_Garden_NotConstructed  N_of_School_Constructed  N_of_School_NotConstructed
0    SE1                        1                           2                        2                           1
1    SE2                        1                           0                        3                           2

方法二:用groupby+agg自定义聚合逻辑

如果你想更清晰地对应每个目标列的计算规则,可以用Groupby结合自定义聚合函数,每一步的逻辑都一目了然:

result = df.groupby('Sector').agg(
    # 统计已构建的Garden数量
    N_of_Garden_Const=('Status', lambda x: ((df.loc[x.index, 'Usage'] == 'Garden') & (x == 'Constructed')).sum()),
    # 统计已构建的School数量
    N_of_School_Const=('Status', lambda x: ((df.loc[x.index, 'Usage'] == 'School') & (x == 'Constructed')).sum()),
    # 统计未构建的Garden数量
    N_of_Garden_Not_Const=('Status', lambda x: ((df.loc[x.index, 'Usage'] == 'Garden') & (x == 'Not_Constructed')).sum()),
    # 统计未构建的School数量
    N_of_School_Not_Const=('Status', lambda x: ((df.loc[x.index, 'Usage'] == 'School') & (x == 'Not_Constructed')).sum())
).reset_index()

print(result)

这个方法的输出和方法一完全一致,好处是每个列的计算逻辑都明确写在代码里,方便后续修改或扩展统计规则。

内容的提问来源于stack exchange,提问作者Danish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 14:52:51