代码之家  ›  专栏  ›  技术社区  ›  Karma

基于datetime将df2中的多行追加到df1

  •  1
  • Karma  · 技术社区  · 6 年前

    我有两个数据帧,df1和df2,都有相同的格式。

    例如,df1如下所示:

          Date  A   B   C   D   E
    2018-03-01  1  40  30  30  70
    2018-03-02  3  60  70  50  55
    2018-03-03  4  60  70  45  80
    2018-03-04  5  80  90  30  47
    2018-03-05  3  40  40  37  20
    

    df2型 也许 如下所示:唯一的区别是开始日期

          Date  A   B   C   D   E
    2018-03-03  4  60  70  45  80
    2018-03-04  5  80  90  30  47
    2018-03-05  3  40  40  37  20
    2018-03-06  7  55  26  46  42
    2018-03-07  2  73  46  33  25
    

    我想将df2中的所有行附加到df1中,在本例中,是2018-03-06中的所有行,以便df1变成:

          Date  A   B   C   D   E
    2018-03-01  1  40  30  30  70
    2018-03-02  3  60  70  50  55
    2018-03-03  4  60  70  45  80
    2018-03-04  5  80  90  30  47
    2018-03-05  3  40  40  37  20
    2018-03-06  7  55  26  46  42
    2018-03-07  2  73  46  33  25
    

    笔记 :df2可能会跳过2018-03-06,因此如果是这种情况,将复制并追加2018-03-07中的所有行。

    df['Date']的数据类型是datetime64。当我试图索引df1的最后一个\u日期以查找要从df2复制的下一个\u日期时,出现了一个错误。

    >>>> last_date = df1['Date'].tail(1)
    >>>> next_date = datetime.datetime(last_date) + datetime.timedelta(days=1)
    TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'
    

    或者,您将如何复制df2中的所有行(从df1的最后一个日期之后的日期开始),并将它们附加到df1?谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   cs95 abhishek58g    6 年前

    选项1
    使用 combine_first Date 列:

    i = df1.set_index('Date')
    j = df2[df2.Date.gt(df1.Date.max())].set_index('Date')
    
    i.combine_first(j).reset_index()
    
             Date    A     B     C     D     E
    0  2018-03-01  1.0  40.0  30.0  30.0  70.0
    1  2018-03-02  3.0  60.0  70.0  50.0  55.0
    2  2018-03-03  4.0  60.0  70.0  45.0  80.0
    3  2018-03-04  5.0  80.0  90.0  30.0  47.0
    4  2018-03-05  3.0  40.0  40.0  37.0  20.0
    5  2018-03-06  7.0  55.0  26.0  46.0  42.0
    6  2018-03-07  2.0  73.0  46.0  33.0  25.0
    

    选项2
    concat + groupby

    pd.concat([i, j]).groupby('Date').first().reset_index()
    
             Date  A   B   C   D   E
    0  2018-03-01  1  40  30  30  70
    1  2018-03-02  3  60  70  50  55
    2  2018-03-03  4  60  70  45  80
    3  2018-03-04  5  80  90  30  47
    4  2018-03-05  3  40  40  37  20
    5  2018-03-06  7  55  26  46  42
    6  2018-03-07  2  73  46  33  25