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

