#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. спасибо за ответ, я просто выбираю ответ выше, потому что это кажется более прямым подходом к решению моей проблемы.