2014-07-04 70 views
0

基本上我有兩個DataFrame並希望通過匹配第二個第三個元素和第一個元素來重新填充第二個列。舉個例子,我在兩個DataFrame中都有列「Period」和「Hub」。對於第二個DataFrame中的每一行,我想獲取Index(它是一個日期)和「Product」/「Hub」(它們是字符串)的值,並找到第一個DataFrame中具有相同值的行相應的列)並從該行返回「期間」的值。然後,我可以使用此值在第二個DataFrame中填充我的行。通過匹配另一個DataFrame中的值來優化pandas DataFrame列的填充

我有一個工作解決方案,但它真的很慢。也許這只是由於DataFrames的大小(大約100k行),但它需要花費一個多小時才能完成!

無論如何,這是我的工作解決方案 - 任何提示如何加快它將非常感激!

def selectData(hub, product): 
    qry = "Hub=='"+hub+"' and Product=='"+product+"'" 
    return data_1.query(qry) 

data_2["Period"] = data_2.apply(lambda row: selectData(row["Hub"], row["Product"]).ix[row.index, "Period"], axis=1) 

編輯:我要指出的是,第一個數據幀是保證有一個唯一的結果我的查詢,但包含更大的一組來填充data_2

EDIT2要求比數據的:我只是意識到這是事實上不是工作的解決方案...

+0

PLS顯示輸入數據和你所期望的輸出是什麼。可複製的soln是最好的。 – Jeff

回答

1

如果我正確理解你的問題,你想merge這2數據幀上index(date), Product, Hubdata_1

獲得

我沒有數據,但隨機測試它int s。它應該是非常快100K排在data_1

#data_1 is the larger dictonary 

n=100000 
data_1 = pd.DataFrame(np.random.randint(1,100,(n,3)), 
         index=pd.date_range('2012-01-01',periods=n, freq='1Min').date, 
         columns=['Product', 'Hub', 'Period']).drop_duplicates() 
data_1.index.name='Date' 

#data_2 is a random subset, w/o column Period 
data_2 = data_1.ix[np.random.randint(0,len(data_1),1000), ['Product','Hub']] 

要加入對指數+某些列,你可以這樣做:

data_3 = data_2.reset_index().merge(data_1.reset_index(), on=['Date','Product','Hub'], how='left') 
相關問題