如何遍历DataFrame每间隔57行对指定3行按列求和并替换原行
实现方案(基于Pandas)
以下代码可直接复现你的需求,两种实现方式分别适配不同数据量场景:
前置准备:依赖导入+测试数据构造
import pandas as pd import numpy as np # 构造和你描述结构一致的测试DataFrame df = pd.DataFrame( np.concatenate([ np.full((3,3), 10), # 0-2行值为10 np.full((54,3), 0), # 3-56行(共54行)占位 np.full((3,3), 20), # 57-59行值为20 np.full((54,3), 0), # 60-113行(共54行)占位 np.full((3,3), 30) # 114-116行值为30 ]), columns=['2020/01/02', '2020/02/01', '2020/03/01'] )
方法1:循环实现(逻辑直观,适合中小数据量)
step = 57 # 每组起始位置的间隔 group_size = 3 # 每组需要求和的连续行数 sum_list = [] # 遍历所有组的起始索引 for start_idx in range(0, len(df), step): # 对每组连续3行按列求和,存入列表 group_sum = df.iloc[start_idx: start_idx + group_size].sum() sum_list.append(group_sum) # 转换为DataFrame,索引保留原始组的起始位置 result_df = pd.DataFrame(sum_list, index=range(0, len(df), step))
方法2:向量化分组实现(性能更高,适合百万级以上大数据量)
step = 57 group_size = 3 # 生成分组标签:目标组内的行标记为组起始索引,非目标组标记为空 group_label = np.full(len(df), np.nan) for start_idx in range(0, len(df), step): group_label[start_idx: start_idx + group_size] = start_idx # 按组求和,自动丢弃非目标组 result_df = df.groupby(group_label).sum()
最终输出result_df即可得到你需要的结果:
| 索引 | 2020/01/02 | 2020/02/01 | 2020/03/01 |
|---|---|---|---|
| 0 | 30 | 30 | 30 |
| 57 | 60 | 60 | 60 |
| 114 | 90 | 90 | 90 |
内容的提问来源于stack exchange,提问作者M_Neelakandan
相关产品推荐
相关产品推荐

