根据2个数据框列中的值创建计数器列

时间:2019-05-31 19:44:44

标签: python-3.x

我希望基于2个数据帧列中的行值创建一个计数器列,此处以Col1和Col2表示。

数据集的示例如下:

Col1    Col2
 a       0
 a       0
 a       0
 a       1
 a       0
 a       0
 a       0
 a       1
 a       1
 b       0
 b       0
 b       1
 b       1
 b       0
 b       0

其中Col1是一个标识变量,当我遇到新的标识变量时,我希望计数器重新开始(因此,当“ a”切换为“ b”时,计数器返回0)。

Col2表示数据中有新输入。当出现1时,将出现一个新的输入,此后的0对应于该输入中的测量值。每次出现1时,我都希望计数器变量递增1。每次1返回0时(反之亦然),我也希望计数器递增1。基于上面的数据集,我希望输出看起来类似于Col3中的以下内容:

Col1    Col2    Col3
 a       0       0
 a       0       0
 a       0       0
 a       1       1
 a       0       2
 a       0       2
 a       0       2
 a       1       3
 a       1       4
 b       0       0
 b       0       0 
 b       1       1
 b       1       2
 b       0       3
 b       0       3

因此,基本上每次Col2从0切换到1,并且每次出现1时,我都希望计数器增加。每次在Col2中出现0时,我希望计数器保持相同的值。每次Col1更改为新ID(在这种情况下,从“ a”更改为“ b”)时,我都希望计数器从0开始。

我主要使用条件语句来执行此操作,但是其中有很多语句,并且我希望在大型数据集上运行它,这将需要几个小时才能运行。在这两个列上都具有这些条件,是否有一种快速简便的方法来运行类似内容?还是有人对转换这些数据提出建议,以使运行这样的分类更加容易?

我知道这是一个令人困惑的要求,所以请让我知道我是否可以做些什么来使我所寻找的内容更加清楚。

谢谢!

1 个答案:

答案 0 :(得分:0)

df.assign(Col4=df1.groupby('Col1').Col2.apply(lambda x: 
     pd.Series(pd.np.r_[False,(x[1:]==1) |(x.values[1:] != x.values[:-1])].cumsum())).values)
   Col1  Col2  Col3  Col4
0     a     0     0     0
1     a     0     0     0
2     a     0     0     0
3     a     1     1     1
4     a     0     2     2
5     a     0     2     2
6     a     0     2     2
7     a     1     3     3
8     a     1     4     4
9     b     0     0     0
10    b     0     0     0
11    b     1     1     1
12    b     1     2     2
13    b     0     3     3
14    b     0     3     3