【问题标题】:Update pandas dataframe current row attribute based on its value in the previous row for each row根据每行前一行中的值更新熊猫数据框当前行属性
【发布时间】:2020-01-14 00:49:46
【问题描述】:

我需要对数据框执行以下步骤:

  1. 为第一行的“余额”属性分配一个起始值。
  2. 使用以下公式根据前一行的值计算后续行的“余额”值,例如:(前一行余额 + 1)

我尝试了以下步骤:

创建数据框:

df = pd.DataFrame(pd.date_range(start = '2019-01-01', end = '2019-12-31'),columns = ['dt_id'])

创建了名为“balance”的属性:

df["balance"] = 0

尝试有条件地更新数据框:

df["balance"] = np.where(df.index == 0, 100, df["balance"].shift(1) + 1)

结果:

据我观察,正在检索该值以进行后续更新,然后才能在原始数据帧中对其进行更新。

“平衡”属性的期望输出:

  • 第 0 行:100

  • 第 1 行:101

  • 第 2 行:102

等等

【问题讨论】:

    标签: python pandas python-2.7


    【解决方案1】:

    如果我理解正确,如果你在你的后面加上这行代码,你就准备好了:

    df["balance"].cumsum()
    
    0      100.0
    1      101.0
    2      102.0
    3      103.0
    4      104.0
           ...  
    360    460.0
    361    461.0
    362    462.0
    363    463.0
    364    464.0
    

    这是一个累积和,它与前一个值相加,因为你有起始值,然后是你想要的。

    【讨论】:

    • 是的,这就是我要找的,谢谢。我会试一试并标记为已解决。
    • 只是我们的好奇,在我需要在公式上使用前一行的余额来计算当前行的余额的情况下,我该怎么做呢?
    • 你也会这样做,因为你只需要起始值。每个值都是预览 +1,因此您只需要一个起始值。我说的对吗?
    【解决方案2】:

    您遇到的问题是,您想要计算一个数组并且元素相互依赖。因此,例如,元素 2 取决于数组中的元素 1。元素 3 依赖于元素 2,依此类推。

    如果有一个简单的解决方案,取决于您使用的公式,即,您是否可以对其进行矢量化。这是关于该主题的一个很好的解释:Is it possible to vectorize recursive calculation of a NumPy array where each element depends on the previous one?

    在你的情况下,一个简单的循环应该做到这一点:

    balance = np.empty(len(df.index))
    balance[0] = 100
    for i in range(1, len(df.index)):
      balance[i] = balance[i-1] + 1  # or whatever formula you want to use
    

    请注意,以上是通用解决方案。您的公式可以矢量化,因此也可以使用以下方法生成:

    balance = 100 + np.arange(0, len(df.index))
    

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 2019-07-06
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2022-08-04
      相关资源
      最近更新 更多