Python - создайте столбец счетчика на основе изменений другого столбца и запустите счетчик снова - PullRequest
1 голос
/ 28 марта 2019

У меня есть набор данных с фазами Луны. Я хочу создать новый столбец, который будет считать дни от Fase One до Fase Four . Начиная снова с 1 после запуска Fase One . В итоге мой счетчик будет иметь от 1 до 27 или 28 дней.

Я проверил эту ссылку, но мне не удалось снова начать подсчет с 1 Столбец счетчика в кадре данных Pandas, где он изменяется в зависимости от другого столбца . Я попытался с for, но не дает мне ожидаемый результат

Я пытался с for и без for

for i in Moon.phaseIdM:
    Moon['phaseMDay'] = (Moon.phaseIdM.eq(1) 
        & Moon.phaseIdM.shift().eq(4)).cumsum() + 1

Я ожидаю:

фазаM | phaseMday

  1    |    1

  1    |    2

  2    |    3

  2    |    4

  3    |    5

  4    |    6

  4    |    7

  1    |    1  

  2    |    2 ...

Что я получаю:

фазаM | phaseMday

  1    |    1

  1    |    1

  2    |    1

  2    |    1

  3    |    1

  4    |    1

  4    |    1

  1    |    2  

  2    |    2 ...

Заранее спасибо за помощь

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Вы можете сделать это, сначала назначив инкрементные значения столбцу all, а затем удалите значение последней начальной строки 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 голос
/ 28 марта 2019

Вы можете создать группировщика Фаза 1-Фаза 4 следующим образом:

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

Затем сгруппируйте и выполните кумулятивный подсчет:

df['phaseMday'] = df.groupby('phase_group').cumcount()+1
0 голосов
/ 28 марта 2019

Это должно сработать, но я вполне уверен, что есть векторизованный способ сделать то же самое.

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
...