我有一个包含月相的数据集。我想创建一个新列,计算从 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 ...
预先感谢您的帮助
答案 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