【问题标题】:Calculate column value based on 2 dataframes根据 2 个数据框计算列值
【发布时间】:2017-08-11 14:28:11
【问题描述】:

我有 2 个数据框,一个有一个日期列,另一个有 2 个日期列。两者都有相同的索引,即一个 ID。

我的第一个问题是确定我是否正确,如果我想在两个数据帧上计算,具有相同索引的行将一起计算?

我的第二个问题是,我想在 df1 中的日期和 df2 的日期之一之间做一个区别,如下所示:

df1:

            Date1
 L-22     2015-03-12 
 L-15     2016-02-26

df2:

            Date2              Date3
 L-15     2016-01-11             NaT
 L-22        NaT              2017-01-08

我做了这样的事情,它给出了错误,('NaTType'对象没有属性'notnull')

      for i in df1.index:
         if df2['Date2'].ix[i].notnull():
            df1['Days_diff'] = df2['Date2'].sub(df1(train['Date1'], axis=0))
         elif df2['Date3'].ix[i].notnull():
            df1['Days_diff'] =df3['Date3'].sub(df1(train['Date1'], axis=0))

有什么想法吗?谢谢!

【问题讨论】:

    标签: python pandas datetime numpy


    【解决方案1】:

    我认为您需要 combine_firstNaN 替换为列之间的值:

    dates = df2.Date2.combine_first(df2.Date3)
    #alternative solution
    #dates = df2.Date2.fillna(df2.Date3)
    
    print (dates)
    L-15   2016-01-11
    L-22   2017-01-08
    Name: Date2, dtype: datetime64[ns]
    

    然后减去值:

    df1['Days_diff'] = dates.sub(df1['Date1'], axis=0)
    print (df1)
    
              Date1  Days_diff
    L-22 2015-03-12   668 days
    L-15 2016-02-26   -46 days
    

    另一种解决方案是使用conditions,但似乎输出相同:

    date2  = df2['Date2'].where(df2['Date2'].notnull()).sub(df1['Date1'], axis=0)
    date3  = df2['Date3'].where(df2['Date3'].notnull()).sub(df1['Date1'], axis=0)
    print (date2)
    L-15   -46 days
    L-22        NaT
    dtype: timedelta64[ns]
    
    print (date3)
    L-15        NaT
    L-22   668 days
    dtype: timedelta64[ns]
    
    df1['Days_diff'] = date2.combine_first(date3)
    print (df1)
              Date1  Days_diff
    L-22 2015-03-12   668 days
    L-15 2016-02-26   -46 days
    

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 2015-08-09
      • 2023-03-29
      • 2019-05-19
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多