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

