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

问题描述 投票:0回答:2

如果我们有一个包含以下值的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
python python-3.x pandas numpy
2个回答
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
投票

你描述的是递归计算,在大熊猫中,一般的方法是使用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循环通常更好。)

© www.soinside.com 2019 - 2024. All rights reserved.