基于存储在另一列中的索引创建列的矢量化方式



我有一个列,它在滚动窗口中存储另一列的最后一个有效索引的索引。这是基于这个答案完成的。

例如,我们有

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

我如何使用这些索引将同一数据帧中不同列col_b的值存储到新列new_col的上面记录的索引中?

例如,如果不同的列col_b

'col_b': [100, 200, 300, 400, 500, 600]

则基于上述索引的CCD_ 4的预期结果将是

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

PS。让我知道以某种方式(总是在滚动窗口上(直接使用初始col是否更容易

这行得通吗?它所做的是使用df['new']作为索引来访问df['col_b']中的值。这需要将df['new']转换为int,因此它有一些中间步骤,用0s替换nans,然后将nans放回新列中。

new_as_idx = df['new'].copy()
new_as_idx[np.isnan(new_as_idx)] = 0
new_as_idx = new_as_idx.astype(int)
new_b = df['col_b'].to_numpy()[new_as_idx]
new_b = new_b.astype('float')
new_b[np.isnan(df['new'])] = np.nan
df['new_b'] = new_b

一个想法是通过col_b创建索引,然后通过原始索引的最大值调用Series.idxmax进行索引:

df = df.set_index('col_b')
df['new']=df.index.to_series().where(df.col).ffill().rolling(3).apply(lambda x: x.idxmax())
df = df.reset_index(drop=True)
print (df)
col    new
0   True    NaN
1  False    NaN
2   True  300.0
3   True  400.0
4  False  400.0
5  False  400.0

在解决方案中,可以通过df['new']为值添加Series.reindex,因为重复的索引是必要的——重新创建原始索引:

df['new'] = df[['col_b']].reindex(df['new']).set_index(df.index)
print (df)
col  col_b    new
0   True    100    NaN
1  False    200    NaN
2   True    300  300.0
3   True    400  400.0
4  False    500  400.0
5  False    600  400.0

或者,如果总是RangeIndex是可能的,则使用numpy索引,删除缺失的值并强制转换为整数:

s = df['new'].dropna().astype(int)
df['new'] = pd.Series(df['col_b'].to_numpy()[s], index=s.index)
print (df)
col  col_b    new
0   True    100    NaN
1  False    200    NaN
2   True    300  300.0
3   True    400  400.0
4  False    500  400.0
5  False    600  400.0

Btw,您的解决方案可能会简化:

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

相关内容

  • 没有找到相关文章