如何获取下面的数据框
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
结束为止),...等等
任何人都可以帮忙。
答案 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首先执行diff
和cumsum
,然后我们需要找到条件来忽略先前获得的值(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