假设我有一个如下形式的 DataFrame,其中第一列是一个随机数,其他列将基于前一列中的值。
为了便于使用,假设我希望每个数字都是前一个数字的平方。所以它看起来像下面这样。
我知道我可以编写一个非常简单的循环来执行此操作,但我也知道循环在 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 计算中引用前一列的值。
最佳答案
您所描述的是递归关系,我认为目前没有任何非循环方式可以做到这一点。诸如 apply
和 rolling_apply
之类的东西仍然依赖于在开始之前获得所有需要的数据,并在结束时一次性输出所有结果数据。也就是说,它们不允许您使用同一系列 的较早值来计算下一个值。请参见 this question 和 this one 以及 this pandas issue。
实际上,对于您的示例,您只有三列要填写,因此执行三遍循环(如其他一些答案所示)可能不会对性能造成重大影响。
关于python - 当先前的值很重要时如何使用 `apply()` 或其他矢量化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42983906/