Pandas按时间顺序重复行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas按时间顺序重复行相关的知识,希望对你有一定的参考价值。

我正在尝试复制我的大熊猫数据框的行,并在列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。

先感谢您!

答案

解决问题的两个步骤:

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
另一答案

这是一个类似的@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

以上是关于Pandas按时间顺序重复行的主要内容,如果未能解决你的问题,请参考以下文章

Pandas +不按索引删除特定行[重复]

如何以正确的顺序对月份进行排序 Jan-Dec Pandas [重复]

按特定顺序选择特定行[重复]

Pandas 按顺序排列列

scrapy按顺序启动多个爬虫代码片段(python3)

python - 如何按python中的因子级别对pandas数据框中的行进行重新排序?