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

如何基于另一列存储的索引向量化创建新列?含替代方案问询

问题描述

我有一列存储了滑动窗口(rolling window)中另一列的最后有效索引,实现逻辑基于某Stack Overflow方案。示例如下:

d = {'col': [True, False, True, True, False, False]}
df = pd.DataFrame(data=d)

通过以下代码得到滑动窗口内的最后有效索引:

df['new'] = df.index
df['new'] = df['new'].where(df.col).ffill().rolling(3).max()

输出结果:

0    NaN
1    NaN
2    2.0
3    3.0
4    3.0
5    3.0

两个具体问题

  1. 如何利用这些索引,将同一DataFrame中另一列col_b对应索引的值存入新列new_col?例如,若col_b为:
    'col_b': [100, 200, 300, 400, 500, 600]
    
    则new_col的期望结果为:
    0    NaN
    1    NaN
    2    300
    3    400
    4    400
    5    400
    
  2. 是否可以直接使用初始列col来实现该需求(始终基于滑动窗口)?

解决方案

问题1:利用已有索引列获取col_b对应值

可以通过take()方法配合类型转换实现,这是最简洁的方式:

# 构造完整的DataFrame
d = {'col': [True, False, True, True, False, False], 'col_b': [100, 200, 300, 400, 500, 600]}
df = pd.DataFrame(data=d)

# 生成滑动窗口内的最后有效索引列
df['new'] = df.index
df['new'] = df['new'].where(df.col).ffill().rolling(3).max()

# 生成目标列new_col
df['new_col'] = df['col_b'].take(df['new'].astype('Int64'), allow_fill=True)

运行后new_col的输出完全符合预期:

0    NaN
1    NaN
2    300
3    400
4    400
5    400

说明:astype('Int64')将float类型的索引转为支持缺失值的整数类型,allow_fill=True让NaN位置返回NaN,完美匹配需求。

问题2:直接用初始列col实现需求

当然可以,无需单独生成索引列,直接对col_b应用相同逻辑即可:

d = {'col': [True, False, True, True, False, False], 'col_b': [100, 200, 300, 400, 500, 600]}
df = pd.DataFrame(data=d)

# 直接生成new_col
df['new_col'] = df['col_b'].where(df['col']).ffill().rolling(3).max()

输出结果与预期一致:

0    NaN
1    NaN
2    300.0
3    400.0
4    400.0
5    400.0

说明:核心逻辑和处理索引的思路一致——先用where(df['col'])保留col为True时的col_b值,其余设为NaN;再用ffill()向前填充最近有效值;最后通过rolling(3).max()确保只取滑动窗口内的最后有效值(因索引递增,最大值对应窗口内最新的有效记录)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:12:23