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

时间:2019-03-28 15:32:23

标签: python pandas counting

我有一个包含月相的数据集。我想创建一个新列,计算从 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 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 ...

预先感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您可以先为所有列分配增量值,然后通过检查新起点的位置在所有行下删除最后一个开始行 Face One 的值来做到这一点是,并使用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

答案 1 :(得分:1)

您可以按以下步骤创建“阶段1-阶段4”分组程序:

df['phase_group'] = ((df['phaseM']==1) & (df['phaseM'].shift()==4)).cumsum()

然后分组并进行累计计数:

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

答案 2 :(得分:0)

这应该可以,但是我很确定有矢量化的方法可以做到这一点。

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