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

求助:基于timestamp分组求和为Pandas DataFrame新增total列

解决Pandas中按时间分组求和并映射回原DataFrame的问题

嘿,我明白你的困扰了——直接用groupby('Timestamp').sum()确实会把每个时间戳合并成一行,没法直接加到原数据里。不过别担心,用transform方法就能完美解决这个问题,它会把分组聚合的结果广播到原DataFrame的每一行,正好满足你的需求!

具体实现步骤

1. 先构造你的原始DataFrame(方便复现)

import pandas as pd

data = {
    'Timestamp': ['2018-01-01', '2018-01-01', '2018-02-01', '2018-03-01', '2018-03-01',
                  '2018-04-01', '2018-04-01', '2018-05-01', '2018-06-01', '2018-06-01'],
    'group': [1, 0, 0, 1, 0, 1, 0, 1, 1, 0],
    'total_per_group': [5, 1, 7, 0, 4, 2, 1, 4, 5, 2]
}

df = pd.DataFrame(data)
# 建议把Timestamp转成datetime类型,后续操作更规范
df['Timestamp'] = pd.to_datetime(df['Timestamp'])

2. 添加total列的核心代码

# 按Timestamp分组,对total_per_group求和,用transform保留原行结构
df['total'] = df.groupby('Timestamp')['total_per_group'].transform('sum')

3. 查看结果

运行后你会得到和预期完全一致的DataFrame:

Timestamp  group  total_per_group  total
0 2018-01-01      1                5      6
1 2018-01-01      0                1      6
2 2018-02-01      0                7      7
3 2018-03-01      1                0      4
4 2018-03-01      0                4      4
5 2018-04-01      1                2      3
6 2018-04-01      0                1      3
7 2018-05-01      1                4      4
8 2018-06-01      1                5      7
9 2018-06-01      0                2      7

为什么transform能解决问题?

  • 普通的groupby.sum()会返回聚合后的结果(每个时间戳一行),而transform会将聚合结果匹配到原DataFrame的每一行,保持原数据的行数和索引不变,所以可以直接赋值为新列。
  • 这种方法比先聚合再merge更简洁高效,尤其适合处理大规模数据。

备选方案:用merge实现

如果你更习惯用合并的方式,也可以这么做:

# 先计算每个Timestamp的总和
total_df = df.groupby('Timestamp')['total_per_group'].sum().reset_index(name='total')
# 合并回原DataFrame
df = df.merge(total_df, on='Timestamp', how='left')

结果和transform方法完全一样,只是步骤多了一点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:18:29