2014-07-04 72 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') 
相关问题