【问题标题】:Create New Pandas DataFrame Column with Values using Previous Row使用上一行创建具有值的新 Pandas DataFrame 列
【发布时间】:2018-03-02 06:52:05
【问题描述】:

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


    【解决方案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
    

    【讨论】:

    • 是否有更通用的解决方案来处理today's y = 2*(previous day's y) + (today's x) 之类的问题。更新了问题。
    • @Nyxynyx 这将涉及一些数学问题,请稍等
    【解决方案2】:

    您描述的是递归计算,在 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 循环通常更好。)

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 2020-03-10
      • 2019-02-17
      • 1970-01-01
      • 2020-09-04
      • 2023-01-10
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多