根据2个数据帧计算列值

时间:2017-03-20 10:39:11

标签: python pandas datetime numpy

我有2个数据框,一个有Date列,另一个有2个Dates列。两者都有相同的索引,即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))

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我认为您需要combine_first来替换NaN列之间的值:

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