Pandas按时间顺序重复行

问题描述 投票:0回答:2

我正在尝试复制我的大熊猫数据框的行,并在列FROMTO之间的几分钟内添加一个额外的列。

例如,我有这个数据框。

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的Python。

先感谢您!

python pandas dataframe refactoring
2个回答
1
投票

解决问题的两个步骤:

pd.date_rangeapplystrftime

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]

applystack

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

1
投票

这是一个类似的@chrisz使用concatiterrows以及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
© www.soinside.com 2019 - 2024. All rights reserved.