为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

侃侃尔雅 2022-08-16 09:46:32
假设我有这个熊猫系列: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


查看完整回答
反对 回复 2022-08-16
?
浮云间

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,如下所示:outoutNan

out_series = pd.Series(out)
out_series[out >= np.arange(len(out))] = np.nan


查看完整回答
反对 回复 2022-08-16
  • 2 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信