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

Pandas中Groupby求和与除法:计算Occupancy占比及统计指标

在Pandas中实现Groupby求和与百分比计算

这里有两种简洁的方法帮你完成需求,我会一步步拆解清楚:

方法一:先转置(Pivot)再计算

这种方法先把Occupancy的两个状态转成列,再逐步计算所需指标,逻辑很直观:

1. 构造原始DataFrame

首先我们先把你提供的数据转换成Pandas DataFrame:

import pandas as pd

data = {
    'Place': ['Bangalore', 'Bangalore', 'Chennai', 'Chennai', 'Delhi', 'Delhi'],
    'Occupancy': ['Occupied', 'Vacant', 'Occupied', 'Vacant', 'Occupied', 'Vacant'],
    'Number': [80, 20, 90, 60, 20, 20]
}
df = pd.DataFrame(data)

2. 转置数据,拆分Occupancy状态

用pivot把每个Place对应的Occupied和Vacant数值拆成单独列:

pivoted_df = df.pivot(index='Place', columns='Occupancy', values='Number').reset_index()
# 给列重命名,方便后续操作
pivoted_df.columns = ['Place', 'Number_occupied', 'Number_vacant']

3. 计算总和与占用率百分比

接下来计算每个Place的总数量,以及已占用的百分比:

# 计算总数量
pivoted_df['Total_Number'] = pivoted_df['Number_occupied'] + pivoted_df['Number_vacant']
# 计算占用率百分比(已占用数/总数 * 100)
pivoted_df['Occupancy_%'] = (pivoted_df['Number_occupied'] / pivoted_df['Total_Number']) * 100

4. 调整列顺序到目标格式

最后把列调整成你需要的顺序:

final_df = pivoted_df[['Place', 'Occupancy_%', 'Total_Number', 'Number_vacant', 'Number_occupied']]
print(final_df)

输出结果:

Place  Occupancy_%  Total_Number  Number_vacant  Number_occupied
0   Bangalore         80.0           100             20               80
1     Chennai         60.0           150             60               90
2       Delhi         50.0            40             20               20

方法二:Groupby聚合一步到位

如果你更喜欢用groupby直接处理,可以用自定义聚合函数一次性提取所需数值:

import pandas as pd

# 构造原始数据(和方法一相同)
data = {
    'Place': ['Bangalore', 'Bangalore', 'Chennai', 'Chennai', 'Delhi', 'Delhi'],
    'Occupancy': ['Occupied', 'Vacant', 'Occupied', 'Vacant', 'Occupied', 'Vacant'],
    'Number': [80, 20, 90, 60, 20, 20]
}
df = pd.DataFrame(data)

# 分组聚合,提取每个Place的已占用和空置数量
result_df = df.groupby('Place').agg(
    Number_occupied=('Number', lambda x: x[df.loc[x.index, 'Occupancy'] == 'Occupied'].sum()),
    Number_vacant=('Number', lambda x: x[df.loc[x.index, 'Occupancy'] == 'Vacant'].sum())
).reset_index()

# 计算总数量和占用率
result_df['Total_Number'] = result_df['Number_occupied'] + result_df['Number_vacant']
result_df['Occupancy_%'] = (result_df['Number_occupied'] / result_df['Total_Number']) * 100

# 调整列顺序
result_df = result_df[['Place', 'Occupancy_%', 'Total_Number', 'Number_vacant', 'Number_occupied']]
print(result_df)

这个方法的输出和方法一完全一致,适合习惯用groupby处理分组逻辑的场景。

小提示:你提供的目标DataFrame最后一行的Place应该是笔误(写成了Bangalore),上面的代码会正确输出Delhi对应的结果哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:03:18