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

如何用向量化操作确定Pandas DataFrame序列条目最终状态

高效计算Pandas时序操作的最终条目状态(替代iterrows)

给定包含时序操作的Pandas DataFrame,操作类型包括inclusao(插入)、alteracao(修改,可更新条目标识符)、exclusao(删除),需要计算所有操作按时间执行后的最终条目状态。当前使用iterrows的方案在百万级数据下效率极低,需用高效的批量处理方法解决。

核心思路

通过标记唯一条目组、动态维护标识符到条目的映射、批量分组筛选最终操作三个步骤实现高效处理,避免逐行循环:

  1. 按时间排序操作,确保执行顺序正确
  2. 为每个插入操作分配唯一条目ID,标记新条目
  3. 动态维护标识符与条目ID的映射,处理标识符变更场景
  4. 将所有操作关联到对应条目ID
  5. 保留每个条目的最后一次非删除操作,得到最终状态

完整代码实现

import pandas as pd

# 生成示例数据(可替换为实际业务数据)
data = {'codinccp_dadosrubrica': ['11', '11', '00', '00', None], 
        'inivalid_iderubrica': [pd.Timestamp('2019-11-01 00:00:00'), pd.Timestamp('2019-11-01 00:00:00'), pd.Timestamp('2019-11-01 00:00:00'), pd.Timestamp('2019-01-01 00:00:00'), pd.Timestamp('2019-11-01 00:00:00')], 
        'inivalid_nova_validade': [None, pd.Timestamp('2019-01-01 00:00:00'), None, None, None], 
        'operacao': ['inclusao', 'alteracao', 'inclusao', 'alteracao', 'exclusao'], 
        'dh_processamento_rubrica': [pd.Timestamp('2020-03-18 23:58:14'), pd.Timestamp('2020-05-14 17:27:06'), pd.Timestamp('2020-06-07 23:46:07'), pd.Timestamp('2021-07-15 19:57:42'), pd.Timestamp('2021-08-13 15:31:56')]}

df = pd.DataFrame(data)

# -------------------------- 核心处理逻辑 --------------------------
# 1. 按处理时间升序排序,确保操作时序正确
df = df.sort_values('dh_processamento_rubrica').reset_index(drop=True)

# 2. 为每个新插入的条目分配唯一ID
df['entry_id'] = (df['operacao'] == 'inclusao').cumsum()

# 3. 构建初始的标识符-条目映射表(仅包含插入操作的标识符)
id_to_entry = df[df['operacao'] == 'inclusao'].set_index('inivalid_iderubrica')['entry_id'].to_dict()

# 4. 按时间顺序处理标识符变更的修改操作,更新映射表
# 仅处理存在新标识符的修改操作
id_change_rows = df[(df['operacao'] == 'alteracao') & df['inivalid_nova_validade'].notna()]
for _, row in id_change_rows.iterrows():
    old_id = row['inivalid_iderubrica']
    new_id = row['inivalid_nova_validade']
    # 将旧ID对应的条目ID映射到新ID,同时移除旧ID的映射(旧ID可复用)
    if old_id in id_to_entry:
        entry_id = id_to_entry.pop(old_id)
        id_to_entry[new_id] = entry_id

# 5. 将非插入操作关联到对应的条目ID(用map替代apply提升效率)
id_entry_series = pd.Series(id_to_entry)
non_inclusao_mask = df['operacao'] != 'inclusao'
df.loc[non_inclusao_mask, 'entry_id'] = df.loc[non_inclusao_mask, 'inivalid_iderubrica'].map(id_entry_series)

# 6. 获取每个条目的最后一次操作
last_operations = df.groupby('entry_id').last().reset_index()

# 7. 过滤掉最后一次操作为删除的条目,得到最终状态
final_state = last_operations[last_operations['operacao'] != 'exclusao'].drop(columns=['entry_id'])

# 调整列顺序与示例预期一致
final_state = final_state[['codinccp_dadosrubrica', 'inivalid_iderubrica', 'inivalid_nova_validade', 'operacao', 'dh_processamento_rubrica']].reset_index(drop=True)

print(final_state)

效率说明

  • 仅对标识符变更的行进行循环,而非所有行,若变更操作占比低,百万级数据可快速处理
  • 核心关联与分组操作均使用Pandas内置向量化方法,避免逐行迭代的高开销
  • 最终输出与示例预期一致:
codinccp_dadosrubrica inivalid_iderubrica inivalid_nova_validade   operacao dh_processamento_rubrica
0                    00          2019-01-01                     NaT  alteracao        2021-07-15 19:57:42

内容的提问来源于stack exchange,提问作者e-motta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:45:55