Pandas/Python создает новый столбец со строками на основе состояния старого столбца и предыдущей строкиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Pandas/Python создает новый столбец со строками на основе состояния старого столбца и предыдущей строки

Сообщение Anonymous »

Я пытаюсь проанализировать некоторые данные в кадре данных и определить, когда в данных появляется время простоя (проявляющееся в виде плоских участков). Эти плоские точки возникают, когда значения disp меняются от > 520 до ~ 225. Я хотел бы создать новый столбец, который будет служить меткой для этих времен.
Это небольшой сжатый пример. выдержка из некоторых моих данных. Полный набор данных содержит около 270 000 строк и может быть зашумлен. Начало периода простоя — строка 150, а конец периода простоя — строка 157.

Код: Выделить всё

           disp      temp
148  528.253551  0.908375
149  537.832220  0.944138
150  225.073475  0.890493
151  225.247861  0.892878
152  225.487333  0.895262
153  225.515279  0.926256
154  225.515003  0.909567
155  225.518680  0.901222
156  225.537893  0.927448
157  225.068878  0.865460
158  540.460613  0.873804
159  531.048884  0.865460
Вывод, который я хотел бы создать:

Код: Выделить всё

           disp      temp      state
148  528.253551  0.908375       None
149  537.832220  0.944138       None
150  225.073475  0.890493   idl_strt
151  225.247861  0.892878       idle
152  225.487333  0.895262       idle
153  225.515279  0.926256       idle
154  225.515003  0.909567       idle
155  225.518680  0.901222       idle
156  225.537893  0.927448       idle
157  225.068878  0.865460   idl_ends
158  540.460613  0.873804       None
159  531.048884  0.865460       None
Есть ли векторизованный способ сделать это? Могут ли функции, вызванные с помощью метода pd.apply, просматривать предыдущие строки без предварительного создания дополнительных сдвинутых столбцов?
Мне уже удалось заполнить правильные строки столбца состояния с помощью «idl_start» и «idl_ends», используя следующий код

Код: Выделить всё

def _idlefinder(self, row):
"""Logic for finding idles start and end"""
if (row["disp"] + 250.0) < row["nextdisp"]:  # find large drops in disp value
return "idle_strt"
elif row["disp"] + 250 < row["lastdisp"]:    # find large increases in disp value
return "idle_end"

df["lastdisp"] = df["disp"].shift(1)
df["nextdisp"] = df["disp"].shift(-1)
df["status"] = df.apply(_idlefinder, axis=1)  # label idle_start and idle_end
df.drop(columns=["nextdisp", "lastdisp"], inplace=True)
Но это неэлегантное и неполное решение. Важнейшая часть того, о чем я спрашиваю, — это как заполнить строки между «idl_strt» и «idl_ends», поскольку оставшиеся разделы данных (подъемы и паузы с зашумленными показаниями) также необходимо будет идентифицировать и пометить. Я предпочитаю не просматривать данные построчно, поскольку я использую фрейм данных.
Предыдущие версии этой программы анализировали эти данные построчно в списках, но стали немного многословен и требует настройки или изменения.

Подробнее здесь: https://stackoverflow.com/questions/791 ... f-old-colu
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»