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
相关产品推荐
相关产品推荐

