gpt4 book ai didi

python-3.x - 自更改以来高效的 p​​andas/numpy 函数

转载 作者:行者123 更新时间:2023-12-03 16:41:09 24 4
gpt4 key购买 nike

给定一个 Series ,我想有效地计算自发生变化以来已经过去了多少次观察。这是一个简单的例子:

ser = pd.Series([1.2,1.2,1.2,1.2,2,2,2,4,3])

print(ser)

0 1.2
1 1.2
2 1.2
3 1.2
4 2.0
5 2.0
6 2.0
7 4.0
8 3.0

我想对 ser 应用一个函数,这将导致:

0    0
1 1
2 2
3 3
4 0
5 1
6 2
7 0
8 0

当我处理大型系列时,我更喜欢不涉及循环的快速解决方案。谢谢

编辑 如果可能,希望该函数也适用于具有相同值的系列(这只会导致一系列整数递增 1)

最佳答案

这是一种 NumPy 方法 -

def array_cumcount(a):
idx = np.flatnonzero(a[1:] != a[:-1])+1
shift_arr = np.ones(a.size,dtype=int)
shift_arr[0] = 0

if len(idx)>=1:
shift_arr[idx[0]] = -idx[0]+1
shift_arr[idx[1:]] = -idx[1:] + idx[:-1] + 1
return shift_arr.cumsum()

sample 运行-

In [583]: ser = pd.Series([1.2,1.2,1.2,1.2,2,2,2,4,3,3,3,3])

In [584]: array_cumcount(ser.values)
Out[584]: array([0, 1, 2, 3, 0, 1, 2, 0, 0, 1, 2, 3])

运行时测试-

In [601]: ser = pd.Series(np.random.randint(0,3,(10000)))

# @Psidom's soln
In [602]: %timeit ser.groupby(ser).cumcount()
1000 loops, best of 3: 729 µs per loop

In [603]: %timeit array_cumcount(ser.values)
10000 loops, best of 3: 85.3 µs per loop

In [604]: ser = pd.Series(np.random.randint(0,3,(1000000)))

# @Psidom's soln
In [605]: %timeit ser.groupby(ser).cumcount()
10 loops, best of 3: 30.1 ms per loop

In [606]: %timeit array_cumcount(ser.values)
100 loops, best of 3: 11.7 ms per loop

关于python-3.x - 自更改以来高效的 p​​andas/numpy 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43211261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com