如何用Python按条件计算数据集每日列值求和并新增列
解决方案:大数据集按日条件求和并添加新列
嘿,我来帮你搞定这个大数据集的按日条件求和问题!用pandas来处理这类需求简直是绝配,尤其是你的数据集有几千条记录,向量化操作能帮你省不少时间,比逐行循环高效太多了。
步骤1:准备测试数据(还原你的数据集)
首先我们把你给出的测试数据转换成pandas DataFrame,方便后续操作:
import pandas as pd import numpy as np # 你的测试数据集 data = { 'id': [0, 1, 2, 3, 4], 'col2': [3, 3, 3, 2, 2], 'col3': [0, 40, 30, 23, 33], 'col4': [50, 35, 30, 14, 33], 'timestamp': ['1-12-2018', '1-12-2018', '1-12-2018', '2-12-2018', '2-12-2018'] } df = pd.DataFrame(data)
步骤2:生成符合条件的待求和值
根据你给出的两个条件,我们用np.where(向量化操作,效率拉满)生成一个临时列value_to_sum,用来存储每条记录要参与求和的值:
# 条件1:col3 < col4时取col4;条件2:col3 >= col4时取col3 df['value_to_sum'] = np.where(df['col3'] < df['col4'], df['col4'], df['col3'])
为什么不用apply?因为apply是逐行处理,几千条数据的话速度会慢很多,np.where是整列批量处理,效率高不止一个档次。
步骤3:按日期分组计算每日总和并添加新列
接下来我们按timestamp(日期)分组,用transform方法把每日的总和广播到对应日期的每条记录里,直接生成新列daily_total:
# 按日期分组求和,并将总和赋值给每条记录的新列 df['daily_total'] = df.groupby('timestamp')['value_to_sum'].transform('sum')
这里用transform而不是普通的sum,是因为普通sum只会返回每个组的结果,而transform会把结果匹配回原DataFrame的每条记录,完美符合你“将结果存入新列”的需求。
可选:清理临时列
如果不需要保留value_to_sum这个临时列,可以直接删掉:
df.drop('value_to_sum', axis=1, inplace=True)
额外优化:确保日期格式正确
如果你的原始数据中timestamp是字符串格式,建议先转换成datetime类型,避免因为格式问题导致分组错误:
# 将timestamp转换为datetime类型(格式是日-月-年) df['timestamp'] = pd.to_datetime(df['timestamp'], format='%d-%m-%Y')
最终结果展示
处理后的数据集会变成这样:
| id | col2 | col3 | col4 | timestamp | daily_total |
|---|---|---|---|---|---|
| 0 | 3 | 0 | 50 | 2018-12-01 | 120 |
| 1 | 3 | 40 | 35 | 2018-12-01 | 120 |
| 2 | 3 | 30 | 30 | 2018-12-01 | 120 |
| 3 | 2 | 23 | 14 | 2018-12-02 | 56 |
| 4 | 2 | 33 | 33 | 2018-12-02 | 56 |
可以看到,12月1日的总和是50+40+30=120,12月2日的总和是23+33=56,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Rubz
相关产品推荐
相关产品推荐

