2017-03-20 22 views
1

2つのデータフレームを持ち、1つは日付列を持ち、もう1つは2つの日付列を持っています。どちらもIDである同じインデックスを持っています。2つのデータフレームに基づいて列の値を計算する

私の最初の質問は、もし私が両方のデータフレームで計算したいのであれば、同じインデックスを持つ行が一緒に計算されることでしょうか?

私の2番目の質問は、私が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

私はあなたが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] 

、その後substract値:

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