python - Pandas 迭代更新列值

标签 python performance pandas numpy iteration

我有一个像下面这样的 pandas 系列:

a = pd.Series([a1, a2, a3, a4, ...])

我想根据以下规则创建另一个 pandas 系列:

b = pd.Series(a1, a2+a1**0.8, a3 + (a2 + a1**0.8)**0.8, a4 + (a3 + (a2 + a1**0.8)** 0.8)**0.8, ...)

这可以使用迭代来实现,但我有一个大型数据集(数百万条记录),我必须执行数千次操作(出于优化目的)。我需要非常快地完成这个操作。有什么可能的方法让我通过使用 pandasnumpy 内置函数来实现这一点?

最佳答案

与其与问题的根本迭代性质作斗争,不如使用 numba 并尝试做最简单的高性能迭代版本:

@numba.jit(nopython=True)
def epow(vec, p):
    out = np.zeros(len(vec))
    out[0] = vec[0]
    for i in range(1, len(vec)):
        out[i] = vec[i] + (out[i-1])**0.8
    return out

这给了我

In [148]: a1, a2, a3, a4 = range(1, 5)

In [149]: a1, a2+a1**0.8, a3 + (a2 + a1**0.8)**0.8, a4 + (a3 + (a2 + a1**0.8)**0.8)**0.8
Out[149]: (1, 3.0, 5.408224685280692, 7.858724574530816)

In [150]: epow(pd.Series([a1, a2, a3, a4]).values, 0.8)
Out[150]: array([1.        , 3.        , 5.40822469, 7.85872457])

对于更长的系列:

In [151]: s = pd.Series(np.arange(2*10**6))

In [152]: %time epow(s.values, 0.8)
CPU times: user 512 ms, sys: 20 ms, total: 532 ms
Wall time: 531 ms
Out[152]: 
array([0.00000000e+00, 1.00000000e+00, 3.00000000e+00, ...,
       2.11487244e+06, 2.11487348e+06, 2.11487453e+06])

关于python - Pandas 迭代更新列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51449260/

相关文章:

python - 将 pandas DataFrame 列拆分为可变数量的列

python - 在我的 Matplotlib 中不显示时间,只显示日期

python - 快速启动 Python Gmail API 代码是否处理刷新 token ?

python - 在数据框之间搜索和查找

python sys.stdin.read() 不需要的拆分

Python 文本分类错误 - 预期字符串或类似字节的对象

java - GWT优化

performance - 为什么 R 中的循环很慢?

pandas - 如何在数据框 Pandas 中合并两行

c++ - 是否有任何 C++ 编译器删除内联时始终持有相同答案的 if 语句?