2017-02-14 5 views
1

日付「間隔」の値と連続した別のデータフレームの値を持つデータフレームがある場合、最初のデータフレームの日付間隔を考慮して、2番目のデータフレームに値を設定します。Pythonは、「ルックアップ」データフレーム内の連続した日付(「間隔」)に基づいて1つのデータフレーム内の値を設定します

だから、
# first dataframe (the "lookup", if you will) 
df1 = pd.DataFrame(np.random.random((10, 1))) 
df1['date'] = pd.date_range('2017-1-1', periods=10, freq='10D') 

# second dataframe 
df2 = pd.DataFrame(np.arange(0,100)) 
df2['date'] = pd.date_range('2016-12-29', periods=100, freq='D') 

DF2日付がより大きいかDF1日に等しく、私たちのようなものだと思いますDF1で連続した日付より小さい場合:適切なため、[0] DF2 [「乗数」] = DF1を要素は日付内に収まります。

また、上限境界がどのように処理されるか、つまりdf2の日付がdf1の中で最も大きい日付よりも大きい場合は、df1の最後の値を取得します。

答えて

0

これは汚いと感じるので、要素ごとの操作の芸術に謝罪すると、ここで私はそれに行きます。

# create an "end date" second column by shifting the date 
df1['end_date'] = df1['date'].shift(-1) + pd.DateOffset(-1) 

# create a simple list by nested iteration 
multiplier = [] 
for elem, row in df2.iterrows(): 
    if row['date'] < min(df1['date']): 
     # kinda don't care about this instance 
     multiplier.append(0) 
    elif row['date'] < max(df1['date']): 
     tmp_mult = df1[(df1['date'] <= row['date']) & (row['date'] <= df1['end_date'])][0].values[0] 
     multiplier.append(tmp_mult) 
     # for l_elem, l_row in df1.iterrows(): 
      # if l_row.date <= row['date'] <= l_row.end_date: 
       # multiplier.append(l_row[0]) 
    else: 
     multiplier.append(df1.loc[df1.index.max(), 0]) 

# set the list as a new column in the dataframe 
df2['multiplier'] = multiplier 
+0

これはnp.piecewiseの素敵な使用では、次のポストで解決されているように見える:http://stackoverflow.com/questions/31328014/merging-dataframes-based-on-date-range しかし、どのdf2日付がdf1最大日付よりも大きい場合に、df1最大日付のIDを取得する方法を追加しますか? –

関連する問題