【发布时间】:2021-04-02 08:10:12
【问题描述】:
我有一个熊猫数据框如下
+---------+------------+------------+-------+--------+
| Product | Date | Adj_Date | Price | Factor |
+---------+------------+------------+-------+--------+
| A | 01-06-2020 | 01-07-2020 | 100 | 10 |
| A | 01-06-2020 | 01-08-2020 | 200 | 20 |
| B | 15-07-2020 | 01-07-2020 | 400 | 10 |
| B | 15-07-2020 | 01-08-2020 | 800 | 10 |
| C | 01-09-2020 | 01-07-2020 | 1000 | 10 |
| C | 01-09-2020 | 01-08-2020 | 1200 | 10 |
| D | 01-10-2020 | 01-11-2020 | 1400 | 10 |
| E | 01-10-2020 | 01-09-2020 | 1600 | 10 |
+---------+------------+------------+-------+--------+
上面生成数据框的代码:
data = {'Product':['A', 'A', 'B', 'B', 'C', 'C', 'D', 'E'],
'Date':['01-06-2020', '01-06-2020', '15-07-2020', '15-07-2020', '01-09-2020', '01-09-2020', '01-10-2020', '01-10-2020'],
'Adj_Date':['01-07-2020', '01-08-2020', '01-07-2020', '01-08-2020', '01-07-2020', '01-08-2020', '01-11-2020', '01-09-2020'],
'Price':[100, 200, 400, 800, 1000, 1200, 1400, 1600],
'Factor':[10,20, 10, 10, 10, 10, 10, 10]}
df =pd.DataFrame(data)
期望的输出:
+---------+------------+------------+-------+--------+--------------+
| Product | Date | Adj_Date | Price | Factor | Actual Price |
+---------+------------+------------+-------+--------+--------------+
| A | 01-06-2020 | 01-07-2020 | 100 | 10 | 10 |
| B | 15-07-2020 | 01-08-2020 | 800 | 10 | 80 |
| C | 01-09-2020 | 01-07-2020 | 1000 | 10 | 1000 |
| D | 01-10-2020 | 01-11-2020 | 1400 | 10 | 140 |
| E | 01-10-2020 | 01-09-2020 | 1600 | 10 | 1600 |
+---------+------------+------------+-------+--------+--------------+
以上结果基于比较Date 和Adj_Date 两列。如果对于任何产品有 2 行,我们选择其中Date 小于Adj_Date 并且Adj_Date 之间的差异最小的行。正如我们在产品 A 中看到的那样,我们在两行中都有 date = 01-06-2020 这个日期小于 Adj_Date,但我们选择 Adj_Date = 01-07-2020 因为与这个日期的差异是最小的。使用相同的逻辑,我们在产品 B 的情况下选择第 2 行。
如果Date 在所有情况下都大于Adj_Date,则我们保留第一行。
下一部分是创建列Actual Price。一旦我们为每个产品设置了单行,我们将Price 与Factor 相除以创建Actual Price,前提是Date 小于Adj_Date。否则Actual Price 等于Price。
怎样才能达到这个结果?
【问题讨论】:
-
请向我们展示您到目前为止所做的尝试。我们可以通过这种方式更好地为您提供帮助。
标签: pandas dataframe group-by duplicates