求助:基于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
相关产品推荐
相关产品推荐

