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

Pandas使用groupby分组时新增的Duration(h:m:s)列不显示如何解决

问题原因

你创建的Duration(h:m:s)列是字符串类型,pivot_table使用sum作为统一聚合函数时,会自动过滤掉无法执行数值求和的非数值列,因此该列没有出现在最终结果中。

解决方法

方案1:先聚合数值列再转时长格式(推荐)

直接对字符串格式的时长求和会得到无意义的拼接结果,更合理的做法是先对数值型的talkTime求和,再将汇总后的总秒数转换为%H:%M:%S格式:

# 先完成数值列的分组聚合
breakdown = df.groupby('costCentre').apply(lambda sub: sub.pivot_table(
    index=['agentname'],
    values=['cost','talkTime'],
    aggfunc= sum,
    margins=True,
    margins_name='Sub-Total',
)).reset_index()

# 把聚合后的总通话秒数转换为时长格式
breakdown["Duration(h:m:s)"] = pd.to_datetime(breakdown["talkTime"], unit='s').dt.strftime("%H:%M:%S")

# 如需保留原始多级索引结构,可执行以下代码
breakdown = breakdown.set_index(['costCentre', 'agentname'])

该方案计算效率高,逻辑清晰,不会出现格式转换错误。

方案2:自定义聚合函数处理时长列

如果需要在pivot_table阶段直接处理时长列,可以自定义针对时长字符串的求和函数,给不同列指定对应的聚合规则:

def sum_duration(duration_series):
    # 将每个时长字符串转换为秒数求和
    total_seconds = sum(pd.to_timedelta(duration_series).dt.total_seconds())
    # 将总秒数转换回HH:MM:SS格式
    return pd.to_datetime(total_seconds, unit='s').strftime("%H:%M:%S")

breakdown = df.groupby('costCentre').apply(lambda sub: sub.pivot_table(
    index=['agentname'],
    values=['cost','talkTime', 'Duration(h:m:s)'],
    # 为不同列指定不同聚合函数
    aggfunc={
        'cost': 'sum',
        'talkTime': 'sum',
        'Duration(h:m:s)': sum_duration
    },
    margins=True,
    margins_name='Sub-Total',
))

该方案性能低于第一种,仅适合数据量较小的场景使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:15:01