Python-根据另一列的更改创建一个计数器列,然后再次启动计数器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-根据另一列的更改创建一个计数器列,然后再次启动计数器相关的知识,希望对你有一定的参考价值。
我有一个月相的数据集。我想创建一个新列,计算从Fase One到Fase Four的日期。一旦Fase One开始,从1开始。所以最后,我的柜台将有1到27或28天。
我检查了这个链接,但我还没有设法再从1开始计数Counter Column in Pandas DataFrame where it changes based on other column。我试过一个for但是没有给我我预期的结果
我试着用for和for for for
for i in Moon.phaseIdM:
Moon['phaseMDay'] = (Moon.phaseIdM.eq(1)
& Moon.phaseIdM.shift().eq(4)).cumsum() + 1
我预计:
phaseM | phaseMday
1 | 1
1 | 2
2 | 3
2 | 4
3 | 5
4 | 6
4 | 7
1 | 1
2 | 2 ...
我得到了什么:
phaseM | phaseMday
1 | 1
1 | 1
2 | 1
2 | 1
3 | 1
4 | 1
4 | 1
1 | 2
2 | 2 ...
在此先感谢您的帮助
答案
您可以按如下方式创建Phase 1-Phase 4分组器:
df['phase_group'] = ((df['phaseM']==1) & (df['phaseM'].shift()==4)).cumsum()
然后分组并做累积计数:
df['phaseMday'] = df.groupby('phase_group').cumcount()+1
另一答案
您可以先将增量值分配给all列,然后通过检查新起始条件的位置并使用cummax
删除最后一个起始行Face One到下面所有行的值,例如:
Moon['phaseMDay'] = np.arange(len(Moon))
Moon['phaseMDay'] -= (Moon['phaseMDay']*(Moon.phaseIdM.eq(1)
& Moon.phaseIdM.shift().eq(4)).values).cummax()-1
你得到:
print (Moon)
phaseIdM phaseMDay
0 1 1
1 1 2
2 2 3
3 2 4
4 3 5
5 4 6
6 4 7
7 1 1
8 2 2
另一答案
这应该做但我很确定有一种矢量化的方法来做同样的事情。
df=pd.DataFrame([1,1,2,2,3,3,4,4,1,2],columns=['phaseM'])
df['phaseMday']=np.linspace(1,len(df),len(df))
for i in range(1,len(df1)):
if df['phaseM'].iloc[i]<df['phaseM'].iloc[i-1]:
df['phaseMday'].iloc[i]=1
else:
df['phaseMday'].iloc[i]=df1['phaseMday'].iloc[i-1]+1
以上是关于Python-根据另一列的更改创建一个计数器列,然后再次启动计数器的主要内容,如果未能解决你的问题,请参考以下文章