python - Pandas - 相对于当前行的最近匹配
问题描述
我想在我的数据框中添加一个新列,其中包含最新的 'revenue' 值,其中 'promotion' == 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]
解决方案
这可能会奏效。我们可以使用移位。这从您的基本 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
推荐阅读
- firebase - FireabaseAuth 频繁超时
- reactjs - useDebounce Hook doesn't allow me to type
- node.js - React Formik Form 与样式组件在输入 1 个字符后完全重新渲染
- sql - 如何在其他两个连接之间执行连接
- sql - 如何在 BigQuery SQL 中使用 UNNEST 和 SPLIT 避免重复?
- excel - 有没有办法为特定工作簿创建“孤立”Excel 实例?
- docker - odoo 新模块不可用
- verilog - 我正在使用带有 N/S 灯和 E/W 灯的摩尔电路制作交通灯控制器,并且我的输出一直显示为所有 X
- r - sjPlot::plot_model - 在 2x2 面板图中绘制 3 向交互并更改固定效果的标签
- python - 我正在尝试使用 tf.tensor_scatter_nd_update 制作二进制遮罩层,但我无法满足形状约束