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()
逻辑说明
df['comp_date'].where(df['ven'].isna()):只保留ven为NaN的行对应的comp_date,其余位置设为NaNshift(1):将整个序列向下偏移1行,确保不会取到当前行自己的comp_date,符合「当前行之前」的要求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
相关产品推荐
相关产品推荐

