python - 当先前的值很重要时如何使用 `apply()` 或其他矢量化方法

标签 python python-3.x pandas

假设我有一个如下形式的 DataFrame,其中第一列是一个随机数,其他列将基于前一列中的值。

enter image description here

为了便于使用,假设我希望每个数字都是前一个数字的平方。所以它看起来像下面这样。

enter image description here

我知道我可以编写一个非常简单的循环来执行此操作,但我也知道循环在 python/pandas 中通常不是最有效的。如何使用 apply()rolling_apply() 完成此操作?或者,以其他方式更有效地完成?

我的(失败的)尝试如下:

In [12]: a = pandas.DataFrame({0:[1,2,3,4,5],1:0,2:0,3:0})

In [13]: a
Out[13]: 
   0  1  2  3
0  1  0  0  0
1  2  0  0  0
2  3  0  0  0
3  4  0  0  0
4  5  0  0  0

In [14]: a = a.apply(lambda x: x**2)

In [15]: a
Out[15]: 
    0  1  2  3
0   1  0  0  0
1   4  0  0  0
2   9  0  0  0
3  16  0  0  0
4  25  0  0  0


In [16]: a = pandas.DataFrame({0:[1,2,3,4,5],1:0,2:0,3:0})

In [17]: pandas.rolling_apply(a,1,lambda x: x**2)
C:\WinPython64bit\python-3.5.2.amd64\lib\site-packages\spyderlib\widgets\externalshell\start_ipython_kernel.py:1: FutureWarning: pd.rolling_apply is deprecated for DataFrame and will be removed in a future version, replace with 
        DataFrame.rolling(center=False,window=1).apply(args=<tuple>,kwargs=<dict>,func=<function>)
  # -*- coding: utf-8 -*-
Out[17]: 
      0    1    2    3
0   1.0  0.0  0.0  0.0
1   4.0  0.0  0.0  0.0
2   9.0  0.0  0.0  0.0
3  16.0  0.0  0.0  0.0
4  25.0  0.0  0.0  0.0

In [18]: a = pandas.DataFrame({0:[1,2,3,4,5],1:0,2:0,3:0})

In [19]: a = a[:-1]**2

In [20]: a
Out[20]: 
    0  1  2  3
0   1  0  0  0
1   4  0  0  0
2   9  0  0  0
3  16  0  0  0

In [21]: 

所以,我的问题主要是如何在我的 DataFrame 计算中引用前一列的值。

最佳答案

您所描述的是递归关系,我认为目前没有任何非循环方式可以做到这一点。诸如 applyrolling_apply 之类的东西仍然依赖于在开始之前获得所有需要的数据,并在结束时一次性输出所有结果数据。也就是说,它们不允许您使用同一系列 的较早值来计算下一个值。请参见 this questionthis one 以及 this pandas issue

实际上,对于您的示例,您只有三列要填写,因此执行三遍循环(如其他一些答案所示)可能不会对性能造成重大影响。

关于python - 当先前的值很重要时如何使用 `apply()` 或其他矢量化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42983906/

相关文章:

regex - 使用字典替换字符串 - 正则表达式

python - 试图在 python 中创建一个菜单,但循环不会退出

python - 获取列值出现后的所有行 pandas

Python数据帧获取连续值的索引开始和结束

python zlib - 压缩字符串的大小与香农熵

python - 如何从 csv 中读取多行

python - 我如何在python的Elasticsearch查询中使用 “filter”?

python - 字符串到字典

python - 在 Python 3.x 中设计搜索运算符转换器的最佳方法?

python - 无法将先知模型从 ADLS 读取到 python