查找先前出现的元素的索引的矢量化方法

假设我有这个熊猫系列:


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]


侃侃尔雅
浏览 91回答 2
2回答

扬帆大鱼

您可以使用 来移动索引:groupbynum.index.to_series().groupby(num).shift()输出:0&nbsp; &nbsp; &nbsp;NaN1&nbsp; &nbsp; &nbsp;NaN2&nbsp; &nbsp; &nbsp;NaN3&nbsp; &nbsp; &nbsp;NaN4&nbsp; &nbsp; &nbsp;NaN5&nbsp; &nbsp; &nbsp;NaN6&nbsp; &nbsp; &nbsp;4.07&nbsp; &nbsp; &nbsp;5.08&nbsp; &nbsp; &nbsp;3.09&nbsp; &nbsp; &nbsp;1.010&nbsp; &nbsp; 0.011&nbsp; &nbsp; 2.0dtype: float64

浮云间

可以在 中继续工作。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,如下所示:outoutNanout_series&nbsp;=&nbsp;pd.Series(out) out_series[out&nbsp;>=&nbsp;np.arange(len(out))]&nbsp;=&nbsp;np.nan
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python