Как обновить значения условно в For L oop для нескольких категорий - PullRequest
1 голос
/ 28 мая 2020

У меня есть DataFrame, где «B» - это категория, а «Boy» - это событие, для мальчика выделено {1,2,3,4} B = 1; Boy = 1 использует B для 10 минут, начиная с 12 : 00 до End = 12:10, следующий мальчик должен использовать его из End_Time [0]. Например, для B = 1 есть четыре образца, а B = 2 различных 4 образца

Входной образец:

B   Boy Start   End     Out
1   1   12:00   12:10   0:10
1   2   12:01   12:11   0:10
1   3   12:02   12:12   0:10
1   4   12:03   12:13   0:10
2   5   12:00   12:10   0:05
2   6   12:01   12:11   0:05
2   7   12:02   12:12   0:05
2   8   12:03   12:13   0:05
3   9   12:00   12:10   0:03
3   10  12:01   12:11   0:03
3   11  12:02   12:12   0:03
3   12  12:03   12:13   0:03

Код пробовал:

data_1['End'] = pd.to_datetime(data_1['Start'] + pd.to_timedelta(data_1['Out'])
for i in range(1, len(data_1)):
    data_1.loc[i, 'Start'] = data_1.loc[i-1, 'End'] 

Вывод:

B   Boy Start   End     Out
1   1   12:00   12:10   0:10
1   2   12:10   12:20   0:10
1   3   12:20   12:30   0:10
1   4   12:30   12:40   0:10
2   5   12:40   12:45   0:05
2   6   12:45   12:50   0:05
2   7   12:50   12:55   0:05
2   8   12:55   13:00   0:05
3   9   13:00   13:03   0:03
3   10  13:03   13:06   0:03
3   11  13:06   13:09   0:03
3   12  13:09   13:12   0:03

Ошибка кода:

new_Start_time = []
for i,item in data_1.groupby('B'):
    temp_list = [item.iloc[0,2]]
    list_all  = [item.iloc[0,3]]
    for j in range(len(list_all)):
        temp_list[j+1] = [list_all[j] for i in range(len(list_all) - 1) ]
        temp_list.append(temp_list[j])
    new_Start_time.extend(temp_list)
data_1['new_Start_time'] = new_Start_time   

Ошибка: IndexError: индекс назначения списка вне диапазон

Ожидаемый результат:

B   Boy Start   End     Out
1   1   12:00   12:10   0:10
1   2   12:10   12:20   0:10
1   3   12:20   12:30   0:10
1   4   12:30   12:40   0:10
2   5   12:00   12:05   0:05
2   6   12:05   12:10   0:05
2   7   12:10   12:15   0:05
2   8   12:15   12:20   0:05
3   9   12:00   12:03   0:03
3   10  12:03   12:06   0:03
3   11  12:06   12:09   0:03
3   12  12:09   12:12   0:03

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Я нашел решение. Не самый лучший вариант, если ваш стол действительно большой, но он работает. Сначала я преобразовал столбцы в datetime и timedelta:

df["Start"] = pd.to_datetime(df["Start"], format='%H:%M')
df["End"] = pd.to_datetime(df["End"], format='%H:%M')
df["Out"] = pd.to_timedelta("0"+df["Out"]+":00")

Затем код для создания новых начальных и конечных столбцов:

new_start =[]
new_end = []
for i, group in df.groupby("B"):
    temp_start =[]
    temp_end = []
    out = group.iloc[0,4]
    for j in range(0,group.shape[0]):
        if j==0:
            temp_start.append(group.iloc[0,2])
            temp_end.append(group.iloc[0,2]+out)
        else:
            temp_start.append(temp_end[j-1])
            temp_end.append(temp_start[j]+out)
    new_start.extend(temp_start)
    new_end.extend(temp_end)

Теперь обновите старые начальный и конечный столбцы с помощью новые значения:

df["Start"]= new_start
df["End"] = new_end
df

Вывод:

    B  Boy  Start               End                 Out
0   1   1   1900-01-01 12:00:00 1900-01-01 12:10:00 00:10:00
1   1   2   1900-01-01 12:10:00 1900-01-01 12:20:00 00:10:00
2   1   3   1900-01-01 12:20:00 1900-01-01 12:30:00 00:10:00
3   1   4   1900-01-01 12:30:00 1900-01-01 12:40:00 00:10:00
4   2   5   1900-01-01 12:00:00 1900-01-01 12:05:00 00:05:00
5   2   6   1900-01-01 12:05:00 1900-01-01 12:10:00 00:05:00
6   2   7   1900-01-01 12:10:00 1900-01-01 12:15:00 00:05:00
7   2   8   1900-01-01 12:15:00 1900-01-01 12:20:00 00:05:00
8   3   9   1900-01-01 12:00:00 1900-01-01 12:03:00 00:03:00
9   3   10  1900-01-01 12:03:00 1900-01-01 12:06:00 00:03:00
10  3   11  1900-01-01 12:06:00 1900-01-01 12:09:00 00:03:00
11  3   12  1900-01-01 12:09:00 1900-01-01 12:12:00 00:03:00
0 голосов
/ 28 мая 2020

Вы можете использовать:

def toTimeDelta(s):
    h = pd.to_timedelta(s.str.split(':').str[0].astype(int), unit='h')
    m = pd.to_timedelta(s.str.split(':').str[1].astype(int), unit='m')
    return h + m


def fx(s):
    s = s.transform(toTimeDelta)
    out = s['Out'].copy()
    out.iloc[0] += s['Start'].iloc[0]
    s['End'] = out.cumsum()
    s['Start'].iloc[1:] = s['End'].shift().iloc[1:]
    return s

df[['Start', 'End', 'Out']] = df.groupby('B')[['Start', 'End', 'Out']].apply(fx)

Результат:

# print(df)
    B  Boy    Start      End      Out
0   1    1 12:00:00 12:10:00 00:10:00
1   1    2 12:10:00 12:20:00 00:10:00
2   1    3 12:20:00 12:30:00 00:10:00
3   1    4 12:30:00 12:40:00 00:10:00
4   2    5 12:00:00 12:05:00 00:05:00
5   2    6 12:05:00 12:10:00 00:05:00
6   2    7 12:10:00 12:15:00 00:05:00
7   2    8 12:15:00 12:20:00 00:05:00
8   3    9 12:00:00 12:03:00 00:03:00
9   3   10 12:03:00 12:06:00 00:03:00
10  3   11 12:06:00 12:09:00 00:03:00
11  3   12 12:09:00 12:12:00 00:03:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...