大熊猫按日期累计条件总和

时间:2017-03-22 14:04:17

标签: python pandas

想象一下像这样的pandas DataFrame

      date  id  initial_value  part_value
2016-01-21   1            100          10
2016-05-18   1            100          20
2016-03-15   2            150          75
2016-07-28   2            150          50
2016-08-30   2            150          25
2015-07-21   3             75          75

使用以下

生成
df = pd.DataFrame({
    'id': (1, 1, 2, 2, 2, 3),
    'date': tuple(pd.to_datetime(date) for date in
                  ('2016-01-21', '2016-05-18', '2016-03-15', '2016-07-28', '2016-08-30', '2015-07-21')),
    'initial_value': (100, 100, 150, 150, 150, 75),
    'part_value': (10, 20, 75, 50, 25, 75)}).sort_values(['id', 'date'])

我希望添加一个列,其中initial_value定义的剩余值减去{id}之前的part_value累积和。因此,我希望我的目标是

      date  id  initial_value  part_value  goal
2016-01-21   1            100          10   100
2016-05-18   1            100          20    90
2016-03-15   2            150          75   150
2016-07-28   2            150          50    75
2016-08-30   2            150          25    25
2015-07-21   3             75          75    75

我认为可以通过合并herehere的解决方案来制定解决方案,但我无法弄明白。

2 个答案:

答案 0 :(得分:2)

如果不使用dates值需要addsubgroupby cumsum

df['goal'] = df.initial_value.add(df.part_value).sub(df.groupby('id').part_value.cumsum())
print (df)
        date  id  initial_value  part_value  goal
0 2016-01-21   1            100          10   100
1 2016-05-18   1            100          20    90
2 2016-03-15   2            150          75   150
3 2016-07-28   2            150          50    75
4 2016-08-30   2            150          25    25
5 2015-07-21   3             75          75    75

与...相同:

df['goal'] = df.initial_value + df.part_value - df.groupby('id').part_value.cumsum()
print (df)
        date  id  initial_value  part_value  goal
0 2016-01-21   1            100          10   100
1 2016-05-18   1            100          20    90
2 2016-03-15   2            150          75   150
3 2016-07-28   2            150          50    75
4 2016-08-30   2            150          25    25
5 2015-07-21   3             75          75    75

答案 1 :(得分:0)

我实际上也想出了一个解决方案。我想这种情况正好相同。

df['goal'] = df.initial_value - ((df.part_value).groupby(df.id).cumsum() - df.part_value)
df
        date  id  initial_value  part_value  goal
0 2016-01-21   1            100          10   100
1 2016-05-18   1            100          20    90
2 2016-03-15   2            150          75   150
3 2016-07-28   2            150          50    75
4 2016-08-30   2            150          25    25
5 2015-07-21   3             75          75    75