You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效重命名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:51:53