Панды дублируют строки с временной последовательностью - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь продублировать строки фрейма данных моей панды, а также добавляю дополнительный столбец для временной последовательности в минутах между столбцами FROM и TO.

Например, у меня есть этот фрейм данных.

ID  FROM    TO
A   15:30   15:33
B   16:40   16:44
C   15:20   15:22

Я хочу, чтобы вывод был

ID  FROM    TO  time
A   15:30   15:33   15:30
A   15:30   15:33   15:31
A   15:30   15:33   15:32
A   15:30   15:33   15:33
B   16:40   16:41   16:40
B   16:40   16:41   16:41
C   15:20   15:22   15:20
C   15:20   15:22   15:21
C   15:20   15:22   15:22

В R , я мог бы сделать это: new_df = setDT(df)[, .(ID, FROM, TO, time=seq(FROM,TO,by="mins")), by=1:nrow(df)], но у меня возникли проблемынайти Python-эквивалент этого.

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

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вот пример, аналогичный @chrisz, использующему concat и iterrows вместе с date_range, ограниченным одним шагом

df = pd.concat([pd.DataFrame({
                'ID':row.ID,
                'FROM': row.FROM,
                'TO': row.TO,
                'TIME': pd.Series(pd.date_range(row.FROM, row.TO, freq='60s').time).astype(str).str[:5]
                }) for _, row in df.iterrows()])

      TIME   FROM ID     TO
0    15:30  15:30  A  15:33
1    15:31  15:30  A  15:33
2    15:32  15:30  A  15:33
3    15:33  15:30  A  15:33
0    16:40  16:40  B  16:44
1    16:41  16:40  B  16:44
2    16:42  16:40  B  16:44
3    16:43  16:40  B  16:44
4    16:44  16:40  B  16:44
0    15:20  15:20  C  15:22
1    15:21  15:20  C  15:22
2    15:22  15:20  C  15:22
0 голосов
/ 25 мая 2018

Два шага для решения вашей проблемы:

pd.date_range с apply и strftime

df['duration'] = df.apply(
    lambda row: [
    i.strftime('%H:%M')
    for i in pd.date_range(
        row['FROM'], row['TO'], freq='60s'
        )
    ], 
    axis=1)

  ID   FROM     TO                             duration
0  A  15:30  15:33         [15:30, 15:31, 15:32, 15:33]
1  B  16:40  16:44  [16:40, 16:41, 16:42, 16:43, 16:44]
2  C  15:20  15:22                [15:20, 15:21, 15:22]

apply с stack

df.set_index(['ID', 'FROM', 'TO']) \
    .duration.apply(pd.Series) \
    .stack().reset_index(level=3, drop=True) \
    .reset_index() \
    .set_index('ID')

# Result

     FROM     TO      0
ID
A   15:30  15:33  15:30
A   15:30  15:33  15:31
A   15:30  15:33  15:32
A   15:30  15:33  15:33
B   16:40  16:44  16:40
B   16:40  16:44  16:41
B   16:40  16:44  16:42
B   16:40  16:44  16:43
B   16:40  16:44  16:44
C   15:20  15:22  15:20
C   15:20  15:22  15:21
C   15:20  15:22  15:22
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...