我想在数据框中添加一个新列,其中包含最新的“收入”值,其中“促销” == 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]
答案 0 :(得分:0)
我们可以做到两步
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
答案 1 :(得分:0)
这可能有效。我们可以使用shift。这从您的基本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