Excel的SUMIF的Pythonic版本

时间:2019-07-04 13:36:27

标签: python pandas pandas-groupby

我正在尝试基于每行的多个维度创建一个额外的列。因此,假设我有一个数据框,其中包含两个维度(月份,国家/地区)和一个指标(总和)。基于月维度,我希望新列中的值包含该月的值,日期偏移为两个月(而其他维度保持不变)–参见下表。

在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 |
+--------+---------+-----+------+

1 个答案:

答案 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