【问题标题】:Pandas duplicate rows with time sequence熊猫按时间顺序重复行
【发布时间】:2018-05-25 12:11:19
【问题描述】:

我正在尝试复制我的 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 pandas dataframe refactoring


    【解决方案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
    

    【讨论】:

    • 好先生date_range 是这样的
    【解决方案2】:

    这是@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2017-02-20
      • 2018-10-10
      • 2019-01-02
      • 2021-10-11
      相关资源
      最近更新 更多