Создайте столбец B, который хранит сумму группы в столбце A, но только с заданным значением c - PullRequest
0 голосов
/ 20 июня 2020

У меня есть фрейм данных (ниже), где я читаю данные временного ряда о том, когда свет был включен и оставлен включенным, а затем выключен. Я создал серию вычисляемых столбцов в моем фрейме данных, чтобы идентифицировать каждый кластер (непрерывные кластеры «Вкл»). Что я хотел бы сделать, так это просуммировать общую продолжительность этого кластера, но сохранить это значение только в самое раннее время (первое «Вкл») каждого конкретного кластера. *** Желаемый результат будет выглядеть как столбец «Длина»

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

ЛЮБАЯ помощь будет принята с благодарностью!

Example data table....The desired outcome is the LENGTH column

Данные также здесь (Я НЕВОЗМОЖНО ЗАМЕНИТЬ 0 В КОЛОННАХ "КЛАСТЕР" и "ДЛИНА" с NaN, но они должны быть. ИЗОБРАЖЕНИЕ верное. "

import pandas as pd
import numpy as np

data = {'Series':  ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A' ],
        'Time': [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5],
        'TimeStep': [0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5],
        'Light': ["Off", "Off", "On", "On", "On", "Off", "Off", "Off", "On", "On", "On", "On", "On", "Off", "Off"],
        'Cluster': [0, 0, 1, 1, 1, 0, 0, 0, 1,1, 1, 1, 1, 0, 0],
        'ClusterLength': [0, 0, 1.5, 0, 0, 0, 0, 0, 2.5, 0, 0, 0, 0, 0, 0],              }

df = pd.DataFrame (data, columns = ['Series','Time','TimeStep','Light','Cluster','ClusterLength'])
df

1 Ответ

1 голос
/ 20 июня 2020

Мое решение вычисляет столбцы Cluster и ClusterLength , как на вашем рисунке, то есть с пустыми строками как «отсутствующие» значения.

Чтобы не перезаписывать исходные столбцы, я назвал их Clust и ClustLen .

Начните с определения функции, генерирующей длину кластера для текущей группы строки (сгруппированные по номеру кластера):

def getClustLen(grp):
    rv = pd.Series('', index=grp.index)
    if type(grp.iloc[0].Clust) == int:
        rv.iloc[0] = grp.TimeStep.sum()
    return rv

Затем, чтобы сгенерировать столбец Clust , запустите:

df['Clust'] = (df.Light.ne(df.Light.shift()) & df.Light.eq('On')).cumsum()
df.Clust = df.Clust.where(df.Light == 'On', '')

И последний шаг - создать ClustLen столбец:

df['ClustLen'] = df.groupby('Clust').apply(getClustLen)\
    .reset_index(level=0, drop=True)

Результат:

   Series  Time  TimeStep Light  Cluster  ClusterLength Clust ClustLen
0       A   0.5       0.5   Off        0            0.0               
1       A   1.0       0.5   Off        0            0.0               
2       A   1.5       0.5    On        1            1.5     1      1.5
3       A   2.0       0.5    On        1            0.0     1         
4       A   2.5       0.5    On        1            0.0     1         
5       A   3.0       0.5   Off        0            0.0               
6       A   3.5       0.5   Off        0            0.0               
7       A   4.0       0.5   Off        0            0.0               
8       A   4.5       0.5    On        2            2.5     2      2.5
9       A   5.0       0.5    On        2            0.0     2         
10      A   5.5       0.5    On        2            0.0     2         
11      A   6.0       0.5    On        2            0.0     2         
12      A   6.5       0.5    On        2            0.0     2         
13      A   7.0       0.5   Off        0            0.0               
14      A   7.5       0.5   Off        0            0.0               

В окончательной версии, чтобы сохранить новые значения под исходными именами, измените Clust до Cluster и ClustLen до ClusterLength .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...