如何为Pandas DataFrame月度销售列批量添加分组序号列
实现方法
这里提供两种高效的实现方式,适配你的月度销售DataFrame需求:
方法一:逐列插入序号列(直观易理解)
先保存原始销售列的列表,避免插入新列后列顺序混乱,再根据每个列的位置计算对应序号,插入到目标列右侧:
import pandas as pd import numpy as np # 构造示例DataFrame(模拟你的大型CSV数据) months = pd.date_range(start='2022-01', end='2034-12', freq='MS').strftime('%Y-%m') df = pd.DataFrame(np.random.randint(100, 1000, size=(10, len(months))), columns=months) # 保存原始销售列名 original_sales_cols = df.columns.tolist() # 遍历每个原始列,计算序号并插入 for idx, col_name in enumerate(original_sales_cols): # 计算序号:前6个月为1,后续每12个月递增1 if idx < 6: sequence = 1 else: # 从第7个月开始,每12个月一组,序号从2开始累加 sequence = 2 + ((idx - 6) // 12) # 插入序号列到当前销售列的右侧 # 插入位置 = 原始列索引*2 +1(因每插入一列,后续列位置偏移1) df.insert(idx * 2 + 1, f"{col_name}_seq", sequence)
方法二:合并序号DataFrame(更高效,适合超大型数据)
先单独构造包含所有序号列的DataFrame,再与原始销售数据按列交替合并,减少多次插入操作的开销:
import pandas as pd import numpy as np # 构造示例DataFrame months = pd.date_range(start='2022-01', end='2034-12', freq='MS').strftime('%Y-%m') df = pd.DataFrame(np.random.randint(100, 1000, size=(10, len(months))), columns=months) original_sales_cols = df.columns.tolist() # 生成所有序号值 sequence_values = [] for idx in range(len(original_sales_cols)): if idx < 6: sequence_values.append(1) else: sequence_values.append(2 + ((idx - 6) // 12)) # 构造序号DataFrame sequence_df = pd.DataFrame( [sequence_values] * len(df), columns=[f"{col}_seq" for col in original_sales_cols] ) # 交替合并原始数据和序号数据 merged_column_order = [] for sales_col, seq_col in zip(original_sales_cols, sequence_df.columns): merged_column_order.append(sales_col) merged_column_order.append(seq_col) df = pd.concat([df, sequence_df], axis=1)[merged_column_order]
关键逻辑说明
- 序号计算规则:以列的位置索引(从0开始)为依据,前6个索引(对应2022年1-6月)直接赋值1;从第7个索引开始,通过
(idx-6)//12计算间隔的12个月组数,加2得到对应序号(比如第7-18个月对应序号2,第19-30个月对应序号3,以此类推) - 两种方法都能保证每个销售列右侧紧挨着对应的序号列,且完全符合你的规则
内容的提问来源于stack exchange,提问作者fhaney
相关产品推荐
相关产品推荐

