如果我们有一个包含以下值的Pandas DataFrame
x
date
2017-07-30 1
2017-07-31 2
2017-08-01 3
2017-08-02 4
我们如何创建一个新的列y
,其值使用计算
today's y = 2*(previous day's y) + (today's x)
对于最古老的日期,y
将是1
预期结果:
x y
date
2017-07-30 1 1
2017-07-31 2 4
2017-08-01 3 11
2017-08-02 4 26
尝试:
import pandas as pd
d = {
'date': ['2017-07-30', '2017-07-31', '2017-08-01', '2017-08-02'],
'x': [1,2,3,4]
}
df = pd.DataFrame.from_dict(d).set_index('date')
df['y'] = 1
df['y'] = df['y'].shift(1)*2 + df['x']
print(df)
尝试结果
x y
date
2017-07-30 1 NaN
2017-07-31 2 4.0
2017-08-01 3 5.0
2017-08-02 4 6.0
IIUC..cumsum
?
df.x.cumsum()
Out[864]:
date
2017-07-30 1
2017-07-31 3
2017-08-01 6
2017-08-02 10
Name: x, dtype: int64
更新
n=2
s=n**(np.arange(len(df)))[::-1]
df.x.rolling(window=len(df),min_periods=1).apply(lambda x : sum(x*s[-len(x):]))
Out[894]:
date
2017-07-30 1.0
2017-07-31 4.0
2017-08-01 11.0
2017-08-02 26.0
Name: x, dtype: float64
你描述的是递归计算,在大熊猫中,一般的方法是使用expanding
对象和自定义函数:
from functools import reduce # Python 3
df['x'].expanding().apply(lambda r: reduce(lambda prev, value: 2*prev + value, r))
Out:
date
2017-07-30 1.0
2017-07-31 4.0
2017-08-01 11.0
2017-08-02 26.0
Name: x, dtype: float64
有关one of my previous answers性能的详细讨论,请参阅expanding
。 (tl; dr:for循环通常更好。)