【问题标题】:Pandas cumulative conditional sum by datesPandas 按日期累积条件总和
【发布时间】:2017-03-22 22:15:36
【问题描述】:

想象一个像这样的 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 定义的剩余值减去 part_value 的累积总和,条件是之前的 id 和日期。因此,我希望我的目标是

      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 的解决方案来制定解决方案,但我无法完全弄清楚。

【问题讨论】:

  • 你能解释更多dates before吗?如果日期没有排序,输出不一样?
  • 你理解正确。排序事项
  • 好的,那么必须先对值进行排序吗?还是对值进行排序?
  • 我在创建示例时对它们进行了排序,因此可以假定它们已排序。不过很容易排序

标签: python pandas


【解决方案1】:

如果不使用dates 值需要addsubgroupbycumsum

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

【讨论】:

  • 甚至:(df.initial_value - df.groupby('id').part_value.shift(1).fillna(0)).astype(int)?
  • 是的,4 索引中的值有问题 - 100 而不是 25
【解决方案2】:

实际上,我自己也想出了一个解决方案。我想这与正在发生的事情是一样的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2014-04-12
    • 2021-06-09
    • 2019-02-15
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多