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-根据另一列的更改创建一个计数器列,然后再次启动计数器的主要内容,如果未能解决你的问题,请参考以下文章

如何根据火花DataFrame中另一列的值更改列的值

创建一个新表,其中包含另一列的值计数列

根据另一列中的更改创建带有时间戳的最后修改列

LINQ 根据计数 >1 的另一列获取列

python如何根据csv中一列的内容对另一列进行写入

根据 s-s-rS 中另一列的值更改数字格式