假设我有这个熊猫系列:num = pd.Series([1,2,3,4,5,6,5,6,4,2,1,3])我想做的是得到一个数字,比如说5,并返回之前发生的索引。因此,如果我使用元素 5,我应该得到 4,因为该元素出现在索引 4 和 6 中。现在我想为该系列的所有元素执行此操作,并且可以使用for循环轻松完成:for idx,x in enumerate(num): idx_prev = num[num == x].idxmax() if(idx_prev < idx): return idx_prev但是,由于循环,此过程对于较长的串联长度消耗了太多时间。有没有办法以矢量化的形式实现同样的事情?输出应如下所示:[NaN,NaN,NaN,NaN,NaN,NaN,4,5,3,1,0,2]
2 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
您可以使用 来移动索引:groupby
num.index.to_series().groupby(num).shift()
输出:
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
6 4.0
7 5.0
8 3.0
9 1.0
10 0.0
11 2.0
dtype: float64
浮云间
TA贡献1829条经验 获得超4个赞
可以在 中继续工作。numpy
相当于使用是:[num[num == x].idxmax() for idx,x in enumerate(num)]
numpy
_, out = np.unique(num.values, return_inverse=True)
哪个分配
array([0, 1, 2, 3, 4, 5, 4, 5, 3, 1, 0, 2], dtype=int64)
自。现在,您可以将 的坏值分配给 s,如下所示:out
out
Nan
out_series = pd.Series(out) out_series[out >= np.arange(len(out))] = np.nan
添加回答
举报
0/150
提交
取消