【问题标题】:Pandas - most recent match relative to current rowPandas - 相对于当前行的最近匹配
【发布时间】:2020-06-23 03:04:52
【问题描述】:

我想在我的数据框中添加一个新列,其中包含最新的“收入”值,其中“促销”== 1,不包括当前行。数据框将始终按“天”降序排序。对于靠近数据框底部的行,其中没有前一行 'promotion' == 1,理想情况下它应该不返回任何内容(但这不是硬性要求,因为我们通常对最近的记录最感兴趣)。

如果这是我的数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame({'day':[10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
                   'revenue':[12000, 13000, 17000, 14000, 16000,
                              15000, 19000, 17000, 12000, 11000],
                  'promotion':[0, 0, 1, 1, 0, 0, 1, 0, 1, 0]})

新列如下所示:

df['last_promo_rev'] = [17000, 17000, 14000, 19000, 19000, 19000, 12000, 12000, np.nan, np.nan]

【问题讨论】:

    标签: python pandas dataframe feature-engineering


    【解决方案1】:

    这可能有效。我们可以使用移位。这从您的基本 DataFrame 示例开始。

    # Create column with valid promotion values set
    df.loc[:, 'last_promo_rev'] = df.loc[df["promotion"] == 1, "revenue"]
    
    # Shift the column by -1 to move the row up one, then backfill with revenue values.
    df.loc[:, 'last_promo_rev'] = df.loc[:, "last_promo_rev"].shift(-1).bfill(axis="rows")
    

    输出:

       day  revenue  promotion  last_promo_rev
    0   10    12000          0         17000.0
    1    9    13000          0         17000.0
    2    8    17000          1         14000.0
    3    7    14000          1         19000.0
    4    6    16000          0         19000.0
    5    5    15000          0         19000.0
    6    4    19000          1         12000.0
    7    3    17000          0         12000.0
    8    2    12000          1             NaN
    9    1    11000          0             NaN
    

    【讨论】:

    • 当我在第一个表达式中将 df.loc['last_promo_rev'] 更改为 df['last_promo_rev'] 时效果很好
    • 哎呀!是的,应该是这样的。也许我会做一个快速编辑来更新解决方案。
    【解决方案2】:

    我们可以分两步完成

    s=df.revenue.mask(df.promotion!=1).bfill()
    s.update(df.loc[df.promotion==1,'revenue'].shift(-1))
    df['New']=s
    df
       day  revenue  promotion      New
    0   10    12000          0  17000.0
    1    9    13000          0  17000.0
    2    8    17000          1  14000.0
    3    7    14000          1  19000.0
    4    6    16000          0  19000.0
    5    5    15000          0  19000.0
    6    4    19000          1  12000.0
    7    3    17000          0  12000.0
    8    2    12000          1  12000.0
    9    1    11000          0      NaN
    

    【讨论】:

      猜你喜欢
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2022-08-18
      • 2016-02-07
      • 2017-07-11
      • 2023-04-05
      相关资源
      最近更新 更多