我正在尝试基于每行的多个维度创建一个额外的列。因此,假设我有一个数据框,其中包含两个维度(月份,国家/地区)和一个指标(总和)。基于月维度,我希望新列中的值包含该月的值,日期偏移为两个月(而其他维度保持不变)–参见下表。
在Excel中,可能会发生以下情况:
SUMIFS($C:$C,$B:$B,B2,$A:$A,DATE(YEAR(A2),MONTH(A2)-2,DAY(A2)))
以普通语言显示:如果(1)country列包含与我在当前行的country列中引用的单元格相同的值,并且(2)month列包含与I单元格相同的值,则求和'm在当前行的月列中进行引用,但日期偏移为负2个月。
+--------+---------+-----+------+
| month | country | sum | sum2 |
+--------+---------+-----+------+
| 1/1/19 | DE | 58 | 0 |
| 2/1/19 | DE | 61 | 0 |
| 3/1/19 | DE | 89 | 58 |
| 4/1/19 | DE | 45 | 61 |
| 5/1/19 | DE | 33 | 89 |
| 6/1/19 | DE | 17 | 45 |
| 1/1/19 | NL | 18 | 0 |
| 2/1/19 | NL | 23 | 0 |
| 3/1/19 | NL | 56 | 18 |
| 4/1/19 | NL | 22 | 23 |
| 5/1/19 | NL | 49 | 56 |
| 6/1/19 | NL | 64 | 22 |
+--------+---------+-----+------+
答案 0 :(得分:1)
我有把握确定应该这样做:
(df.merge(df.assign(month=df.month + pd.DateOffset(months=2)),
on=['month', 'country'],
how='left',
suffixes=['', '2'])
.groupby(['country', 'month'], as_index=False)
.agg({'sum': 'first',
'sum2': 'sum'}))
country month sum sum2
0 DE 2019-01-01 58 0.0
1 DE 2019-02-01 61 0.0
2 DE 2019-03-01 89 58.0
3 DE 2019-04-01 45 61.0
4 DE 2019-05-01 33 89.0
5 DE 2019-06-01 17 45.0
6 NL 2019-01-01 18 0.0
7 NL 2019-02-01 23 0.0
8 NL 2019-03-01 56 18.0
9 NL 2019-04-01 22 23.0
10 NL 2019-05-01 49 56.0
11 NL 2019-06-01 64 22.0