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

Pandas高效提取ven为null的历史最新comp_date生成新列方法

高效实现方案

你可以用 pandas 向量化操作完全替代循环,核心逻辑是「条件筛选+行偏移+前向填充」,时间复杂度为O(n),比原有循环实现性能提升百倍以上,适合任意规模的数据集。

完整代码示例

首先导入依赖、构造示例数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'unit': [256, 256, 256,256,256,256,256], 
    'date': [np.nan,np.nan,'2020-04-09', '2020-04-09', '2020-04-09',np.nan,'2020-04-10'], 
    'status': ['CMP','CMP','A','A','A','A','A'],
    'comp_date': ['2020-04-08','2020-04-09','2020-04-16', '2020-04-16', '2020-04-16','2020-04-11','2020-04-16'],
    'ven': [np.nan,np.nan,'T', 'T', 'T',np.nan,'T']
})

核心实现仅需一行代码:

# 仅保留ven为NaN行的comp_date,偏移1行(排除当前行)后向前填充
df['new_date'] = df['comp_date'].where(df['ven'].isna()).shift(1).ffill()

逻辑说明

  1. df['comp_date'].where(df['ven'].isna()):只保留ven为NaN的行对应的comp_date,其余位置设为NaN
  2. shift(1):将整个序列向下偏移1行,确保不会取到当前行自己的comp_date,符合「当前行之前」的要求
  3. ffill():对序列做前向填充,每一行都会取到最近的非空值,也就是当前行之前最新的符合条件的comp_date

扩展场景

如果需要按unit分组,每个unit单独计算对应的new_date,只需增加分组逻辑即可:

df['new_date'] = df.groupby('unit')['comp_date'].transform(lambda x: x.where(df['ven'].isna()).shift(1).ffill())

内容的提问来源于stack exchange,提问作者HKE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:39:03