счетчик индекса для if conditions python pandas

#python #pandas

#python #pandas

Вопрос:

Я хотел сгенерировать какой-то цикл для моего фрейма данных. Один цикл в примере ниже имеет длину 4. Последний столбец — это то, как должно выглядеть, остальные — попытки от моего имени.

Мой текущий код выглядит следующим образом:

 import pandas as pd
import numpy as np

l = list(np.linspace(0,10,12))
data = [
        ('time',l),
         ('A',[0,5,0.6,-4.8,-0.3,4.9,0.2,-4.7,0.5,5,0.1,-4.6]),
         ('B',[ 0,300,20,-280,-25,290,30,-270,40,300,-10,-260]),
         ]
df = pd.DataFrame.from_dict(dict(data))
length = len(df)
df.loc[0,'cycle']=1
df['cycle'] = length/4  df.loc[0,'cycle']
i = 0
for i in range(0,length):
    df.loc[i,'new_cycle']=i 1
df['want_cycle']=   [1,1,1,1,2,2,2,2,3,3,3,3]  
print(length)
print(df)
  

Мне действительно нужны условия if в коде, тоже, только увеличьте значение df[‘new_cycle’], если счетчик индекса, например, 4. Но пока мне не удалось найти правильный способ реализации таких условий.

Комментарии:

1. Извините @sulphur, я немного запутался, вы хотите увеличить количество в new_cycle только в том случае, если индекс равен 4?

2. нет, извините, только очень 4, так как вы считаете до 4, а затем увеличиваете i 1

Ответ №1:

Попробуйте это с индексом диапазона по умолчанию, поскольку индекс строки вашего фрейма данных представляет собой диапазон, начинающийся с 0, индекса фрейма данных по умолчанию, вы можете использовать разделение по этажам для вычисления вашего цикла:

 df['cycle'] = df.index//4   1
  

Вывод:

          time    A    B  cycle
0    0.000000  0.0    0      1
1    0.909091  5.0  300      1
2    1.818182  0.6   20      1
3    2.727273 -4.8 -280      1
4    3.636364 -0.3  -25      2
5    4.545455  4.9  290      2
6    5.454545  0.2   30      2
7    6.363636 -4.7 -270      2
8    7.272727  0.5   40      3
9    8.181818  5.0  300      3
10   9.090909  0.1  -10      3
11  10.000000 -4.6 -260      3
  

Теперь, если ваш индекс фрейма данных не задан по умолчанию, вы можете использовать что-то вроде этого:

 df['cycle'] = [df.index.get_loc(i) // 4   1 for i in  df.index]
  

Ответ №2:

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

В цикле for мы проверяем, делится ли i на 4 без остатка, если это так, мы добавляем 1 к новой переменной и заполняем фрейм данных этим значением так же, как вы это делали.

 import pandas as pd
import numpy as np

l = list(np.linspace(0,10,12))
data = [
        ('time',l),
         ('A',[0,5,0.6,-4.8,-0.3,4.9,0.2,-4.7,0.5,5,0.1,-4.6]),
         ('B',[ 0,300,20,-280,-25,290,30,-270,40,300,-10,-260]),
         ]
df = pd.DataFrame.from_dict(dict(data))
length = len(df)
df.loc[0,'cycle']=1
df['cycle'] = length/4  df.loc[0,'cycle']
new_cycle = 0
for i in range(0,length):
    if i % 4 == 0:
        new_cycle  = 1
    df.loc[i,'new_cycle']= new_cycle
df['want_cycle'] = [1,1,1,1,2,2,2,2,3,3,3,3]  
print(length)
print(df) 
  

Комментарии:

1. спасибо за ответ, я просто выбираю ответ выше, потому что это кажется более прямым подходом к решению моей проблемы.