Python Dataframe-在另一个数据帧中优化id搜索

Python Dataframe-在另一个数据帧中优化id搜索,python,pandas,dataframe,Python,Pandas,Dataframe,下面给出了一个场景 我有两个数据帧,称为订单和客户 我想查看OrderDataFrame中的CustomerID在Customer Dataframe的LinkedCustomer列中的位置。LinkedCustomers字段是CustomerID的数组 orders数据框包含大约5.800.000个项目。 客户数据框包含大约180000个项目 我正在寻找一种优化以下代码的方法,因为这段代码运行速度很慢。我怎样才能加快速度 #演示数据——在真实场景中,该数据是从csv-/json文件读取的。

下面给出了一个场景

我有两个数据帧,称为订单和客户

我想查看OrderDataFrame中的CustomerID在Customer Dataframe的LinkedCustomer列中的位置。LinkedCustomers字段是CustomerID的数组

orders数据框包含大约5.800.000个项目。 客户数据框包含大约180000个项目

我正在寻找一种优化以下代码的方法,因为这段代码运行速度很慢。我怎样才能加快速度


#演示数据——在真实场景中,该数据是从csv-/json文件读取的。
orders=pd.DataFrame({'custId':[1,2,3,4],'orderId':[2,3,4,5]})
customers=pd.DataFrame({'id':[5,6,7],'linkedCustomers':[{1,2},{4,5,6},{3,7,8,9}]})
def getMergeCustomerID(行):
customerOrderId=行['custId']
searchMasterCustomer=customers[customers['linkedCustomers'].str.contains(str(customerOrderId))]
searchMasterCustomer=searchMasterCustomer['id']
如果len(searchMasterCustomer)>0:
返回搜索主客户
其他:
返回客户订单
orders['newId']=orders.apply(lambda x:getMergeCustomerID(x),axis=1)
#预期结果
custId orderId newId
1        2        5
2        3        5
3        4        7
4        5        6

我认为在某些情况下,这种方法可以解决您的问题: 先编一本字典

myDict = {}
for i,j in customers.iterrows():
    for j2 in j[1]:
        myDict[j2]=j[0]
然后使用字典创建新列:

orders['newId'] = [myDict[i] for i in orders['custId']]

虽然这可以解决您的问题(加快您的程序),但这并不是最通用的解决方案。欢迎提供更好的答案

为什么不干脆把这两个表合并起来,然后用it@ErikK我有一个类似的问题:我必须合并两个表:第一个表的每个Id与第二个表的较小Id中的最大Id相对应。你知道在线性/合理的时间内做这件事的方法吗?[您希望我提出一个单独的问题吗?]在我的情况下,ID是时间戳并且是有序的,我希望将我的表1与实现并存储在表2上的最后一次测量相匹配。原始匹配是O(N*M),一个合适的算法应该是O(N+M)@jimifiki如果这些表来自数据库,为什么不在那里执行oin,然后导出到pandas呢。熊猫是超级慢相比,数据库已经优化了所有这类工作,并写在Cthanks为您的帮助。我稍微修改了你的代码
python orders['newId']=[myDict[i]如果我在myDict.keys()中,则为我在orders['id']中没有其他值]