【问题标题】:Cumulative grouping in pandas大熊猫的累积分组
【发布时间】:2019-01-20 11:38:51
【问题描述】:

我有一个这样的数据框:

df = 
     name  amount  date
 0     A     10      1
 1     B     15      1
 2     A      5      2
 3     C      7      3
 4     A      8      4
 5     B     10      4
 6     C     11      4

我会根据姓名和日期做一个累积总和,我的意思是,我希望这个例子的结果是:

df_result = 
     name  amount  date
 0     A     10      1
 1     B     15      1
 2     A     15      2
 3     B     15      2
 4     A     15      3
 5     B     15      3
 6     C      7      3
 7     A     23      4
 8     B     25      4
 9     C     18      4

我想显示日期列表示的时间段内的累计值,例如,对于 A 的情况,它在周期 1 中的值为 10,在 2 中为 5,在 3 中为 0(因为它没有出现),在 4 中是 8,因此在 df_result 中显示了累积。 C 直到周期 3 才出现,因为它在该周期之前没有价值

我尝试了 groupby、cumsum 甚至 stack 的不同组合,但我无法实现任何接近的结果。

【问题讨论】:

  • 你能解释一下你如何从输入到输出的逻辑吗?例如,为什么你最终会得到更多的行?看起来你已经“填充”了日期 3……但我可能希望日期 1 在这种情况下有一个带有 0 的 C……
  • 你可能正在寻找这个df.groupby(by=['name','date']).sum().groupby(level=[0]).cumsum().reset_index()
  • 当然@JonClements:我想显示日期列表示的时间段内的累积值,例如,对于A的情况,它在周期1的值是10,在2它为 5,在 3 中为 0(因为它没有出现),在 4 中为 8,因此在 df_result 中显示了累积。 C 直到第 3 期才出现,因为它在该期之前没有价值。我希望我解释得很好
  • @Á.Garzón 请edit 回答你的问题:)

标签: python pandas dataframe


【解决方案1】:

看看有没有帮助:

>>> df.groupby(by=['name','date']).sum().groupby(level=[0]).cumsum().reset_index()
  name  date  amount
0    A     1      10
1    A     2      15
2    A     4      23
3    B     1      15
4    B     4      25
5    C     3       7
6    C     4      18

@Jon 在 cmets 中描述的另一个答案,它会吸引您关闭所显示的内容。

>>> df = df.pivot('date', 'name', 'amount').fillna(0).stack().groupby(level=1).cumsum().astype('int')[lambda v: v != 0].reset_index()

重命名最后一列,因为那将是零。

>>> df.rename(columns={0: 'amount'}, inplace=True)
>>> df
   date name  amount
0     1    A      10
1     1    B      15
2     2    A      15
3     2    B      15
4     3    A      15
5     3    B      15
6     3    C       7
7     4    A      23
8     4    B      25
9     4    C      18

【讨论】:

  • 耶!!非常感谢你!!太完美了!
  • @Á.Garzón 太棒了...但是此处显示的输出与您在问题中所说的输出不同?我很困惑...
  • @Á.Garzón,很高兴它有帮助:-)
  • 哎呀...@JonClements 是对的...我不确定这是否是完美的解决方案,但几乎是一个很好的改进...我现在要测试我的代码万一这个解决方案即使不是必需的也可以使用
  • @Á.Garzón,太好了,什么是有效的组合解决方案?
猜你喜欢
  • 2017-05-15
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
相关资源
最近更新 更多