如何基于另一列存储的索引向量化创建新列?含替代方案问询
问题描述
我有一列存储了滑动窗口(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
两个具体问题
- 如何利用这些索引,将同一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 - 是否可以直接使用初始列
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
相关产品推荐
相关产品推荐

