如何按Hostname和Slot分组对Pandas DataFrame的Reserved列求和?
Pandas分组求和问题解决
问题场景
现有如下Pandas DataFrame:
print(df) # Hostname Slot Port Reserved # Server1 1 1 0 # Server1 1 2 0 # Server1 2 3 1 # Server2 2 1 1 # Server2 2 2 0 # Server2 2 3 1 # Server3 1 1 0 # Server3 2 2 0 # Server3 3 3 1
需要实现按Hostname和Slot分组,对Reserved列求和,期望输出:
Hostname Slot Total_Reserved Server1 1 1 Server2 2 2 Server3 1 1
尝试了以下代码但未得到预期结果:
new_df = df.groupby(['Hostname', 'Slot', 'Reserved']).sum()
问题分析
你错误地将Reserved也加入了分组键,这会让Pandas按Hostname+Slot+Reserved的唯一组合进行分组,而不是对Reserved列求和。比如Server1的Slot1下有两行Reserved=0,分组后会单独成组,求和结果仍为0,完全不符合需求。
正确实现
方法1:指定目标列求和并重置索引
只将Hostname和Slot作为分组键,单独对Reserved列求和,最后通过reset_index将分组键转为普通列,同时重命名求和后的列:
new_df = df.groupby(['Hostname', 'Slot'])['Reserved'].sum().reset_index(name='Total_Reserved')
方法2:使用聚合函数重命名列
通过agg方法直接指定聚合规则和新列名,再重置索引:
new_df = df.groupby(['Hostname', 'Slot']).agg(Total_Reserved=('Reserved', 'sum')).reset_index()
说明
注:根据原始数据计算,Server1 Slot1的Reserved求和结果应为0,Server3 Slot1的求和结果也为0,Server3 Slot3的求和结果为1。你给出的期望结果可能存在笔误,但上述代码完全符合「按Hostname+Slot对Reserved求和」的逻辑。
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

