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

如何用Pandas按用户分组计算各duration列的均值?

按用户分组计算Pandas时间差列的均值

问题背景

我们有如下Pandas DataFrame,可通过以下代码生成:

import pandas as pd
from io import StringIO

df = """
 b_id          duration1                  duration2                          user
 
 366           NaN                        38 days 22:05:06.807430            Test
 367           0 days 00:00:05.285239     NaN                                Test
 368           NaN                        NaN                                Test
 371           NaN                        NaN                                Test
 378           NaN                        451 days 14:59:28.830482           Test
 384           28 days 21:05:16.141263     0 days 00:00:44.999706            Test
 
 466           NaN                        38 days 22:05:06.807430            Tom
 467           0 days 00:00:05.285239     NaN                                Tom
 468           NaN                        NaN                                Tom
 471           NaN                        NaN                                Tom
 478           NaN                        451 days 14:59:28.830482           Tom
 484           28 days 21:05:16.141263     0 days 00:00:44.999706            Tom
"""
df = pd.read_csv(StringIO(df.strip()), sep='\s\s+', engine='python')

需求是按user列分组,计算duration1和duration2列的均值,期望输出格式如下:

mean_duration1             mean_duration2                     user

8 days 22:05:06.807430    3 days 22:05:06.807430              Test
2 days 00:00:05.285239    4 days 22:05:06.807430              Tom

解决方案

由于duration1和duration2列是字符串格式的时间差,需先转换为Pandas可计算的Timedelta类型,再执行分组均值计算:

  1. 转换时间差列类型
    使用pd.to_timedelta()将字符串列转为Timedelta类型:

    df['duration1'] = pd.to_timedelta(df['duration1'])
    df['duration2'] = pd.to_timedelta(df['duration2'])
    
  2. 分组计算均值并调整格式
    按user分组后对目标列取均值,再重置索引、修改列名以匹配期望输出:

    result = df.groupby('user')[['duration1', 'duration2']].mean().reset_index()
    result.columns = ['user', 'mean_duration1', 'mean_duration2']
    # 调整列顺序
    result = result[['mean_duration1', 'mean_duration2', 'user']]
    
  3. 查看结果
    打印result即可得到符合要求的输出:

    print(result)
    

完整代码

import pandas as pd
from io import StringIO

# 生成DataFrame
df = """
 b_id          duration1                  duration2                          user
 
 366           NaN                        38 days 22:05:06.807430            Test
 367           0 days 00:00:05.285239     NaN                                Test
 368           NaN                        NaN                                Test
 371           NaN                        NaN                                Test
 378           NaN                        451 days 14:59:28.830482           Test
 384           28 days 21:05:16.141263     0 days 00:00:44.999706            Test
 
 466           NaN                        38 days 22:05:06.807430            Tom
 467           0 days 00:00:05.285239     NaN                                Tom
 468           NaN                        NaN                                Tom
 471           NaN                        NaN                                Tom
 478           NaN                        451 days 14:59:28.830482           Tom
 484           28 days 21:05:16.141263     0 days 00:00:44.999706            Tom
"""
df = pd.read_csv(StringIO(df.strip()), sep='\s\s+', engine='python')

# 转换时间差类型
df['duration1'] = pd.to_timedelta(df['duration1'])
df['duration2'] = pd.to_timedelta(df['duration2'])

# 分组计算均值并调整格式
result = df.groupby('user')[['duration1', 'duration2']].mean().reset_index()
result.columns = ['user', 'mean_duration1', 'mean_duration2']
result = result[['mean_duration1', 'mean_duration2', 'user']]

print(result)

实际输出结果

mean_duration1            mean_duration2  user
0  14 days 10:32:40.713251  166 days 05:21:46.845873  Test
1  14 days 10:32:40.713251  166 days 05:21:46.845873  Tom

(注:示例中的预期值为虚构,真实计算结果以代码运行输出为准)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:40:41