Python Pandas: 如何使列行依赖于它的前几行,可能有一个函数?
Python Pandas: How to make a column row dependent on it's previous rows, possibly with a function?
我正在尝试根据 A 列和 B 列的先前数据计算 B 列。一个简单的函数示例是
例如B(n) = A(n-1) + B(n-1),
其中 n 是 Pandas 数据帧的索引。我不一定需要使用数据帧索引。
在这个例子中,我从 B(1) = 0 开始,并以连续的方式添加 A 行。
n A(n) B(n)
----------------
1 1 0
2 0 1
3 2 1
4 9 3
此数据结构的示例将在 Pandas 中定义为
d = {'A' : pd.Series([1, 0, 2, 9],),
'B' : pd.Series([0, float("nan"), float("nan"), float("nan")])}
df = pd.DataFrame(d)
更新
Henry Cutchers 和 Jakob 的回答都很好。
您是否考虑过使用 Cython http://www.cython.org?它将与 pandas 互操作——相同的数据结构等(因为 pandas 是用 cython 编写的)。在我看来,您需要能够以任意方式遍历您的数据框(不知道更多关于您的问题,这就是我所能说的),但需要速度。 Cython 编译为 C.
我可以预见以下形式的循环:
import numpy
import pandas
import datetime
dates = pandas.date_range('20130101',periods=6)
myDataFrame = pandas.DataFrame(numpy.arange(12).reshape((6,2)),index=dates,columns=list('ab'))
a=myDataFrame["a"]
b=myDataFrame["b"]
print a
print b
out=numpy.empty_like(a.values)
out[0] = 0
#this loop will work but be slow...
for i in range(1, a.shape[0]):
out[i] = a[i-1] + b[i-1]
myDataFrame['c'] = pandas.Series(out, index=myDataFrame.index)
print myDataFrame
但这会很慢。
您的示例问题可以简化为仅依赖于 B[0] 和 A[n]:
一个可能的简单解决方案看起来像
import pandas as pd
import numpy as np
d = {'A' : pd.Series([1, 0, 2, 9],),
'B' : pd.Series([0, float("nan"), float("nan"), float("nan")])}
df = pd.DataFrame(d)
for i in range(1,len(df.A)):
df.B[i] = df.B[0] + np.sum(df.A[:i])
df
产生数据框
如果您面临类似的迭代依赖,您应该能够构建适合您需求的类似方法。
我正在尝试根据 A 列和 B 列的先前数据计算 B 列。一个简单的函数示例是
例如B(n) = A(n-1) + B(n-1),
其中 n 是 Pandas 数据帧的索引。我不一定需要使用数据帧索引。
在这个例子中,我从 B(1) = 0 开始,并以连续的方式添加 A 行。
n A(n) B(n)
----------------
1 1 0
2 0 1
3 2 1
4 9 3
此数据结构的示例将在 Pandas 中定义为
d = {'A' : pd.Series([1, 0, 2, 9],),
'B' : pd.Series([0, float("nan"), float("nan"), float("nan")])}
df = pd.DataFrame(d)
更新
Henry Cutchers 和 Jakob 的回答都很好。
您是否考虑过使用 Cython http://www.cython.org?它将与 pandas 互操作——相同的数据结构等(因为 pandas 是用 cython 编写的)。在我看来,您需要能够以任意方式遍历您的数据框(不知道更多关于您的问题,这就是我所能说的),但需要速度。 Cython 编译为 C.
我可以预见以下形式的循环:
import numpy
import pandas
import datetime
dates = pandas.date_range('20130101',periods=6)
myDataFrame = pandas.DataFrame(numpy.arange(12).reshape((6,2)),index=dates,columns=list('ab'))
a=myDataFrame["a"]
b=myDataFrame["b"]
print a
print b
out=numpy.empty_like(a.values)
out[0] = 0
#this loop will work but be slow...
for i in range(1, a.shape[0]):
out[i] = a[i-1] + b[i-1]
myDataFrame['c'] = pandas.Series(out, index=myDataFrame.index)
print myDataFrame
但这会很慢。
您的示例问题可以简化为仅依赖于 B[0] 和 A[n]:
一个可能的简单解决方案看起来像
import pandas as pd
import numpy as np
d = {'A' : pd.Series([1, 0, 2, 9],),
'B' : pd.Series([0, float("nan"), float("nan"), float("nan")])}
df = pd.DataFrame(d)
for i in range(1,len(df.A)):
df.B[i] = df.B[0] + np.sum(df.A[:i])
df
产生数据框
如果您面临类似的迭代依赖,您应该能够构建适合您需求的类似方法。