如何高效重命名Pandas DataFrame中指定行后的连续4行ID
高效批量重命名时间序列DataFrame的ID列
针对130万行的大数据量,绝对要避免遍历行,用Pandas的矢量化操作能把效率提升几个数量级。核心思路是先标记锚点行(整秒时刻的点位名称行),再通过填充+分组序号的方式批量生成新ID:
步骤说明
- 标记锚点行:识别出整秒时刻(
time列以,00结尾)的行,这些行的ID是原始点位名称。 - 填充锚点值:用
ffill()向前填充锚点的ID,让每个锚点后的4行都继承对应的点位名称。 - 生成组内序号:对每个锚点分组,生成从0开始的序号,锚点行序号为0,后续行依次为1-4。
- 拼接新ID:序号为0的行保留原ID,序号>0的行拼接
_序号后缀。
代码实现
假设你的DataFrame名为df,先确保time和ID列是字符串类型:
import pandas as pd import numpy as np # 1. 标记锚点行(整秒时刻,time以,00结尾) df['is_anchor'] = df['time'].str.endswith(',00') # 2. 填充锚点的点位名称到后续行 df['base_id'] = df.loc[df['is_anchor'], 'ID'].ffill() # 3. 生成每个锚点组内的序号 df['group_num'] = df['is_anchor'].cumsum() df['seq'] = df.groupby('group_num').cumcount() # 4. 生成最终ID列(用numpy.where替代apply进一步提速) df['ID'] = np.where( df['seq'] == 0, df['base_id'], df['base_id'] + '_' + df['seq'].astype(str) ) # 清理临时列(可选) df = df.drop(['is_anchor', 'base_id', 'group_num', 'seq'], axis=1)
优化点说明
- 全程用Pandas/Numpy内置的矢量化函数,这些操作基于C实现,比Python循环快几十倍甚至上百倍。
- 用
numpy.where替代apply,进一步规避逐行判断的开销,130万行数据处理时间可控制在几秒内。
验证结果
运行后你的DataFrame会完全匹配预期格式,整秒行保留原点位名称,后续行自动拼接_1至_4的后缀。
内容的提问来源于stack exchange,提问作者seanzand
相关产品推荐
相关产品推荐

