组内的 Cumsum 并在 pandas 的条件下重置
Posted
技术标签:
【中文标题】组内的 Cumsum 并在 pandas 的条件下重置【英文标题】:Cumsum within group and reset on condition in pandas 【发布时间】:2018-05-24 07:25:00 【问题描述】:我有一个包含两列 ID 和 Activity 的数据框。活动为 0 或 1。我想要一个包含自上次活动为 1 以来不断增加的数字的新列。但是,计数应该只在一个组 (ID) 内。如果活动为 1,则计数列应重置为 0,然后重新开始计数。
所以,我有一个包含以下内容的数据框:
想要的是这样的:
有人可以帮助我吗?
【问题讨论】:
我真的不清楚.. @Wen 希望这更清楚...? 不要发布数据图片,发布数据。如果您发布图片,您是在说其他人应该花时间输入您的数据,以便重现您的情况。如果您将其作为文本发布,人们可以简单地复制/粘贴。 【参考方案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())
以上是关于组内的 Cumsum 并在 pandas 的条件下重置的主要内容,如果未能解决你的问题,请参考以下文章
在 Python Pandas 中使用 cumsum 和 groupby 并在值为 0 时重置 cumsum
pandas使用groupby函数和cumsum函数计算每个分组内的数值累加值并生成新的dataframe数据列( cumulative sum of each group in dataframe