Python—根据另一列的更改创建一个计数器列,然后再次启动计数器
我有一个关于月亮相位的数据集。我想创建一个新的列来计算从第一阶段到第四阶段的天数。从1开始,一次一开始。因此,到最后,我的计数器将有1到27或28天 我检查了这个链接,但我还没有设法从1开始再次计数。我尝试了一个for,但没有给我预期的结果 我试着用了一个for和一个out forPython—根据另一列的更改创建一个计数器列,然后再次启动计数器,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
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> >应该是,是的,它改变了一切;谢谢,它工作得很好