Python—根据另一列的更改创建一个计数器列,然后再次启动计数器

Python—根据另一列的更改创建一个计数器列,然后再次启动计数器,python,pandas,counting,Python,Pandas,Counting,我有一个关于月亮相位的数据集。我想创建一个新的列来计算从第一阶段到第四阶段的天数。从1开始,一次一开始。因此,到最后,我的计数器将有1到27或28天 我检查了这个链接,但我还没有设法从1开始再次计数。我尝试了一个for,但没有给我预期的结果 我试着用了一个for和一个out for for i in Moon.phaseIdM: Moon['phaseMDay'] = (Moon.phaseIdM.eq(1) & Moon.phaseIdM.shift().eq

我有一个关于月亮相位的数据集。我想创建一个新的列来计算从第一阶段到第四阶段的天数。从1开始,一次一开始。因此,到最后,我的计数器将有1到27或28天

我检查了这个链接,但我还没有设法从1开始再次计数。我尝试了一个for,但没有给我预期的结果

我试着用了一个for和一个out 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 ...
  1    |    1

  1    |    1

  2    |    1

  2    |    1

  3    |    1

  4    |    1

  4    |    1

  1    |    2  

  2    |    2 ...
我得到的是:

phaseM | phaseMday

  1    |    1

  1    |    2

  2    |    3

  2    |    4

  3    |    5

  4    |    6

  4    |    7

  1    |    1  

  2    |    2 ...
  1    |    1

  1    |    1

  2    |    1

  2    |    1

  3    |    1

  4    |    1

  4    |    1

  1    |    2  

  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
df=pd.DataFrame([1,1,2,2,3,3,4,4,1,2],columns=['phaseM']))
df['phaseMday']=np.linspace(1,len(df),len(df))
对于范围(1,len(df1))中的i:

如果df['phaseM'].iloc[i]这应该可以,但我非常确定有一种矢量化的方法可以做到这一点

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
df=pd.DataFrame([1,1,2,2,3,3,4,4,1,2],columns=['phaseM']))
df['phaseMday']=np.linspace(1,len(df),len(df))
对于范围(1,len(df1))中的i:

如果df['phaseM'].iloc[i]您可以通过首先将增量值分配给all列,然后通过检查新开始的条件在何处并使用
cummax
将最后一个开始行的值面一移除到下的所有行来完成此操作,例如:

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

您可以先将增量值指定给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

您可以按如下方式创建阶段1到阶段4石斑鱼:

df['phase_group'] = ((df['phaseM']==1) & (df['phaseM'].shift()==4)).cumsum()
然后分组并进行累积计数:

df['phaseMday'] = df.groupby('phase_group').cumcount()+1

您可以按如下方式创建阶段1到阶段4石斑鱼:

df['phase_group'] = ((df['phaseM']==1) & (df['phaseM'].shift()==4)).cumsum()
然后分组并进行累积计数:

df['phaseMday'] = df.groupby('phase_group').cumcount()+1

听起来有点像你的起始数据?听起来有点像你的起始数据?谢谢@Ben。在某一点上,这个代码是有效的,但随后它确实开始计算负数和大数。(我有2559行),在中间,它开始向下计数SeimeDay- 107284, 107285…@ @ MeaTooTyes是,抱歉,替换<代码> CuMUS<代码> >代码> CuMax < /Cord> >应该是,是的,它改变了一切;谢谢,效果很好谢谢你,本。在某一点上,这个代码是有效的,但随后它确实开始计算负数和大数。(我有2559行),在中间,它开始向下计数SeimeDay- 107284, 107285…@ @ MeaTooTyes是,抱歉,替换<代码> CuMUS<代码> >代码> CuMax < /Cord> >应该是,是的,它改变了一切;谢谢,它工作得很好