【问题标题】:Cumsum within group and reset on condition in pandas组内的 Cumsum 并在 pandas 的条件下重置
【发布时间】:2018-05-24 07:25:00
【问题描述】:

我有一个包含两列 ID 和 Activity 的数据框。活动为 0 或 1。我想要一个包含自上次活动为 1 以来不断增加的数字的新列。但是,计数应该只在一个组 (ID) 内。如果活动为 1,则计数列应重置为 0,然后重新开始计数。

所以,我有一个包含以下内容的数据框:

想要的是这样的:

有人可以帮助我吗?

【问题讨论】:

  • 我真的不清楚..
  • @Wen 希望这更清楚...?
  • 不要发布数据图片,发布数据。如果您发布图片,您是在说其他人应该花时间输入您的数据,以便重现您的情况。如果您将其作为文本发布,人们可以简单地复制/粘贴。

标签: pandas group-by count conditional-statements cumsum


【解决方案1】:

我们在这里使用了一个新的“G”段

df['G']=df.groupby('ID').Activeity.apply(lambda x :(x.diff().ne(0)&x==1)|x==1)

df.groupby([df.ID,df.G.cumsum()]).G.apply(lambda x : (~x).cumsum())

Out[713]: 
0     1
1     2
2     0
3     1
4     2
5     1
6     2
7     0
8     1
9     0
10    1
11    1
12    0
13    0
14    1
15    2
Name: G, dtype: int32

数据输入

df=pd.DataFrame({'ID':list('AAAAABBBBBBCCCCC'),'Activeity':[0,0,1,0,0,0,0,1,0,1,0,0,1,1,0,0]})

解释:

Here we get the new para 'G'
df['G']=df.groupby('ID').Activeity.apply(lambda x :(x.diff().ne(0)&x==1)|x==1)
df
Out[134]: 
    Activeity ID      G
0           0  A  False
1           0  A  False
2           1  A   True
3           0  A  False
4           0  A  False
5           0  B  False
6           0  B  False
7           1  B   True
8           0  B  False
9           1  B   True
10          0  B  False
11          0  C  False
12          1  C   True
13          1  C   True
14          0  C  False
15          0  C  False

然后我们为 G 做cumsum,是为了得到我们应该将数字设置为 0 的循环在哪里

df.G.cumsum()
Out[135]: 
0     0
1     0
2     1
3     1
4     1
5     1
6     1
7     2
8     2
9     3
10    3
11    3
12    4
13    5
14    5
15    5
Name: G, dtype: int32

【讨论】:

  • 这行得通!你能解释一下这里应用了什么逻辑吗?当我们在第二条语句中对cumsum 进行分组时,尤其会让人感到困惑。
  • @sriramn cumsum in groupby 是获取组ID,我会更新答案添加更多解释
  • 实际上,您甚至不需要额外的列。可以直接在Activeity 上完成累计。在 lambda 函数中使用 xor 切换 0 和 1。这是最后的单线:df.groupby(['ID', df.Activeity.cumsum()]).Activeity.apply(lambda x: (x ^ 1).cumsum())
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2015-12-27
  • 2022-01-18
  • 2017-02-06
相关资源
最近更新 更多