使用上一行使用值创建新的Pandas DataFrame列

时间:2018-03-01 22:19:54

标签: python python-3.x pandas numpy

如果我们有一个包含以下值的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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您所描述的是递归计算,在pandas中,一般的方法是使用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

有关expanding的效果的详细讨论,请参阅one of my previous answers。 (tl; dr:for循环通常更好。)