对 pandas 数据帧执行移位和其他操作
Perform shift and other operations on a pandas dataframe
这是我的数据样本
import pandas as pd
dic = {'Drug': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
'Date': ['01-01-20', '01-02-20', '01-03-20', '01-04-20', '01-05-20', '01-10-20', '01-15-20', '01-20-20', '01-21-20', '01-01-20', '01-02-20', '01-03-20', '01-04-20', '01-05-20'],
'Amount': [10, 20, 30, 40, 50,60, 70, 80, 90, 10, 20, 30, 40, 50]}
df = pd.DataFrame(dic)
| Drug | Date | Amount |
| ---- | -------- | ------ |
| A | 01-01-20 | 10 |
| | 01-02-20 | 20 |
| | 01-03-20 | 30 |
| | 01-04-20 | 40 |
| | 01-05-20 | 50 |
| | 01-10-20 | 60 |
| | 01-15-20 | 70 |
| | 01-20-20 | 80 |
| | 01-21-20 | 90 |
| B | 01-01-20 | 10 |
| | 01-02-20 | 20 |
| | 01-03-20 | 30 |
| | 01-04-20 | 40 |
| | 01-05-20 | 50 |
我已经对 Drug 执行了 groupby 并想应用计算 3 个指标的 lambda 函数 -
- 滞后 -> x 天前的药物量
- 趋势 -> 今天的药物数量与 x 天前的数量之间的差异
- Window -> 今天和 x 天前药物数量的平均值(假定数据框中未出现的天数与数据中出现在它们之前的那一天具有相同的值,即,2020 年 1 月 6 日与 2020 年 1 月 5 日具有相同的值。2019 年的天数被认为与 2020 年 1 月 1 日具有相同的值)
这是 x=7 -
情况下我想要的输出
| Drug | Date | Amount | Date 7 Days Ago | Lag | Trend | Window |
| ---- | -------- | ------ | --------------- | --- | ----- | ------ |
| A | 01-01-20 | 10 | 12-26-19 | 10 | 0 | 10.00 |
| | 01-02-20 | 20 | 12-27-19 | 10 | 10 | 11.43 |
| | 01-03-20 | 30 | 12-28-19 | 10 | 20 | 14.29 |
| | 01-04-20 | 40 | 12-29-19 | 10 | 30 | 18.57 |
| | 01-05-20 | 50 | 12-30-19 | 10 | 40 | 24.29 |
| | 01-10-20 | 60 | 01-04-20 | 40 | 20 | 50.00 |
| | 01-15-20 | 70 | 01-09-20 | 50 | 20 | 60.00 |
| | 01-20-20 | 80 | 01-14-20 | 60 | 20 | 70.00 |
| | 01-21-20 | 90 | 01-15-20 | 70 | 20 | 74.29 |
| B | 01-01-20 | 10 | 12-26-19 | 10 | 0 | 10.00 |
| | 01-02-20 | 20 | 12-27-19 | 10 | 10 | 11.43 |
| | 01-03-20 | 30 | 12-28-19 | 10 | 20 | 24.29 |
| | 01-04-20 | 40 | 12-29-19 | 10 | 30 | 18.57 |
| | 01-05-20 | 50 | 12-30-19 | 10 | 40 | 24.29 |
我已经使用 for 循环执行了上述操作,但我想使用更 Pandas 的方法来执行此操作,但我无法弄清楚。
首先整理好你的 df,然后尝试 df.shift(...)。
这是我的数据样本
import pandas as pd
dic = {'Drug': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
'Date': ['01-01-20', '01-02-20', '01-03-20', '01-04-20', '01-05-20', '01-10-20', '01-15-20', '01-20-20', '01-21-20', '01-01-20', '01-02-20', '01-03-20', '01-04-20', '01-05-20'],
'Amount': [10, 20, 30, 40, 50,60, 70, 80, 90, 10, 20, 30, 40, 50]}
df = pd.DataFrame(dic)
| Drug | Date | Amount |
| ---- | -------- | ------ |
| A | 01-01-20 | 10 |
| | 01-02-20 | 20 |
| | 01-03-20 | 30 |
| | 01-04-20 | 40 |
| | 01-05-20 | 50 |
| | 01-10-20 | 60 |
| | 01-15-20 | 70 |
| | 01-20-20 | 80 |
| | 01-21-20 | 90 |
| B | 01-01-20 | 10 |
| | 01-02-20 | 20 |
| | 01-03-20 | 30 |
| | 01-04-20 | 40 |
| | 01-05-20 | 50 |
我已经对 Drug 执行了 groupby 并想应用计算 3 个指标的 lambda 函数 -
- 滞后 -> x 天前的药物量
- 趋势 -> 今天的药物数量与 x 天前的数量之间的差异
- Window -> 今天和 x 天前药物数量的平均值(假定数据框中未出现的天数与数据中出现在它们之前的那一天具有相同的值,即,2020 年 1 月 6 日与 2020 年 1 月 5 日具有相同的值。2019 年的天数被认为与 2020 年 1 月 1 日具有相同的值)
这是 x=7 -
情况下我想要的输出| Drug | Date | Amount | Date 7 Days Ago | Lag | Trend | Window |
| ---- | -------- | ------ | --------------- | --- | ----- | ------ |
| A | 01-01-20 | 10 | 12-26-19 | 10 | 0 | 10.00 |
| | 01-02-20 | 20 | 12-27-19 | 10 | 10 | 11.43 |
| | 01-03-20 | 30 | 12-28-19 | 10 | 20 | 14.29 |
| | 01-04-20 | 40 | 12-29-19 | 10 | 30 | 18.57 |
| | 01-05-20 | 50 | 12-30-19 | 10 | 40 | 24.29 |
| | 01-10-20 | 60 | 01-04-20 | 40 | 20 | 50.00 |
| | 01-15-20 | 70 | 01-09-20 | 50 | 20 | 60.00 |
| | 01-20-20 | 80 | 01-14-20 | 60 | 20 | 70.00 |
| | 01-21-20 | 90 | 01-15-20 | 70 | 20 | 74.29 |
| B | 01-01-20 | 10 | 12-26-19 | 10 | 0 | 10.00 |
| | 01-02-20 | 20 | 12-27-19 | 10 | 10 | 11.43 |
| | 01-03-20 | 30 | 12-28-19 | 10 | 20 | 24.29 |
| | 01-04-20 | 40 | 12-29-19 | 10 | 30 | 18.57 |
| | 01-05-20 | 50 | 12-30-19 | 10 | 40 | 24.29 |
我已经使用 for 循环执行了上述操作,但我想使用更 Pandas 的方法来执行此操作,但我无法弄清楚。
首先整理好你的 df,然后尝试 df.shift(...)。