通过匹配另一个DataFrame中的值来最佳填充pandas DataFrame列

时间:2014-07-04 12:11:14

标签: python optimization pandas

基本上我有两个DataFrame,并希望通过将第二行的三个行元素与第一行匹配来重新填充第二列的列。举个例子,我有专栏" Period"和" Hub"在两个DataFrame中。对于第二个DataFrame中的每一行,我想取Index的值(这是一个日期)和" Product" /" Hub" (它们是字符串)并在第一个DataFrame中找到具有这些相同值的行(在相应的列中)并返回" Period"的值。从那一行。然后,我可以使用此值填充第二个DataFrame中的行。

我有一个有效的解决方案,但它确实很慢。也许这仅仅是由于DataFrames的大小(大约10万行),但需要花费一个多小时来处理!

无论如何,这是我的工作解决方案 - 任何有关如何加快速度的提示都会非常感激!

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)

编辑:我应该注意,第一个DataFrame可以保证我的查询具有唯一的结果,但包含的数据集比填充data_2

所需的数据量要大

EDIT2:我刚才意识到这实际上并不是一个有效的解决方案......

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您需要在mergeindex(date), Product, Hub这两个数据帧,并从Period获取data_1

我没有数据,但是在随机int上测试了它。 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')