【问题标题】:Running sum of most recent members of each group每个组最近成员的运行总和
【发布时间】:2015-09-30 15:42:10
【问题描述】:

这是输入数据框:

  id  val
0  A    1
1  B    2
2  A   -3
3  C    1
4  D    5
5  B    6
6  C   -2

我想按 id 对条目进行分组,然后计算到目前为止看到的每个组的最新成员的运行总和。以下是所需输出的样子,并解释了它是如何获得的:

  id  val  out
0  A    1   1
1  B    2   3   (2 + 1)
2  A   -3   -1  (-3 + 2)  
3  C    1   0   (1+ -3 +2)
4  D    5   5   (5 + 1 + -3 + 2_
5  B    6   9   (6 + 5 + 1 + -3)
6  C   -2   6    (-2 + 6 + 5 -3)

这里有一些更详细的解释: 1) id=1 的行有 3=2+1,因为当时你有 2 个组,As 和 Bs,每个组有 1 行,所以你必须从每个组中取出那一行。

2) id=2 的行有 -1=-3+2,因为那时你有 2 个组,As 和 Bs。 As 中的最新行是 2 A -3,而 Bs 中的单个(因此也是最近的)行是 1 B 2,因此您添加了这两行。

3) 在id=6的那一行,你加起来

2  A   -3
4  D    5
5  B    6
6  C   -2

您从每个组中取出 1 行,那是当时最近的行。

【问题讨论】:

  • 为什么第二个值是 3 ?当 first 的 id 是 A 而 second 的 id 是 B 时。
  • 好吧,此时,您有 2 组,A 和 B,每组有一排。目标是从每个组中获取最新的行,并且您有 2 个组,每个组有 1 行,因此您为它们添加 val 值并获得 2+1。

标签: python pandas group-by dataframe cumsum


【解决方案1】:

这应该是使用循环执行此操作的一种相对快速且简单的方法。它的工作方式是,只要找到一个新条目,它就会在字典中添加一个新条目。如果条目已经存在,它会覆盖相应的值。

df = pd.DataFrame({'id': ['A','B','A','C','D','B','C'],
                  'val': [1,2,-3,1,5,6,-2]})

num_rows = df.shape[0]

last_vals = {}
for i in range(0, num_rows):
    x = df['id'][i]
    last_vals[x] = df['val'][i]

sum(last_vals.values())

【讨论】:

    猜你喜欢
    • 2022-12-15
    • 2016-10-10
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多