为熊猫数据框列'0'和'1'创建一个'group number'列

时间:2019-12-19 13:18:32

标签: python pandas dataframe

如何获取下面的数据框

dd = pd.DataFrame({'val':[0,0,1,1,1,0,0,0,0,1,1,0,1,1,1,1,0,0],
             'groups':[1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,'ignore','ignore']})

     val    groups
0     0       1
1     0       1
2     1       1
3     1       1
4     1       1
5     0       2
6     0       2
7     0       2
8     0       2
9     1       2
10    1       2
11    0       3
12    1       3
13    1       3
14    1       3
15    1       3
16    0  ignore
17    0  ignore

我有一个系列df.val,其值是[0,0,1,1,1,0,0,0,0,1,1,0,1,1,1,1,0,0]
如何从 df.groups 创建 df.val

第一个0,0,1,1,1将形成组1,(即从0之后的1的下一个出现)
/> 0,0,0,0,1,1将组成组2,(递增组号,从上一个组结束,直到0之后的下一个1结束为止),...等等

任何人都可以帮忙。

2 个答案:

答案 0 :(得分:2)

首先测试0之后的下一个值是否为1,并通过Series.cumsum的累加和创建组:

s = (dd['val'].eq(0) & dd['val'].shift().eq(1)).cumsum().add(1)

如果数据的最后一个值是numpy.where,则将最后一组转换为ignore

0

答案 1 :(得分:1)

IIUC首先执行diffcumsum,然后我们需要找到条件来忽略先前获得的值(np.where

s=df.val.diff().eq(-1).cumsum()+1
df['New']=np.where(df['val'].eq(1).groupby(s).transform('any'),s,'ignore')
df
    val  groups     New
0     0       1       1
1     0       1       1
2     1       1       1
3     1       1       1
4     1       1       1
5     0       2       2
6     0       2       2
7     0       2       2
8     0       2       2
9     1       2       2
10    1       2       2
11    0       3       3
12    1       3       3
13    1       3       3
14    1       3       3
15    1       3       3
16    0  ignore  ignore
17    0  ignore  ignore