给出了以下场景。
我有 2 个称为订单和客户的数据帧。
我想查看订单数据帧中的客户 ID 在客户数据帧的"链接客户"列中的位置。"链接客户"字段是一组客户 ID。
订单数据帧包含大约 5.800.000 个项目。 客户数据帧包含大约 180,000 个项目。
我正在寻找一种优化以下代码的方法,因为此代码运行但速度非常慢。我怎样才能加快速度?
# demo data -- In the real scenario this data was read from csv-/json files.
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(row):
customerOrderId = row['custId']
searchMasterCustomer = customers[customers['linkedCustomers'].str.contains(str(customerOrderId))]
searchMasterCustomer = searchMasterCustomer['id']
if len(searchMasterCustomer) > 0:
return searchMasterCustomer
else:
return customerOrderId
orders['newId'] = orders.apply(lambda x: getMergeCustomerID(x), axis=1)
# expected result
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']]
IMO 即使这可以解决您的问题(加快您的程序(,但这不是最通用的解决方案。欢迎更好的答案!