【问题标题】:Convert nested for-loop to lambda function for fast execution将嵌套的 for 循环转换为 lambda 函数以快速执行
【发布时间】:2020-05-20 02:00:58
【问题描述】:

Sample Data

嗨,我的数据框看起来像附加的图像。 Nbr_Cells 列是一个对象列表。我正在尝试在数据框中添加另一列,该列是 Nbr_Cells 列的子列表,如果单个对象以列 cellid 的相同结尾结尾。

例如,

cellid = U21-A000CH-1A
Nbr_Cells =[U21-MCH001-1A,U21-MCH001-2A,U21-SG0024-1A,U21-MCH001-2B]

然后子列表 = [U21-MCH001-1A,U21-SG0024-1A]

因为它以类似的“1A”结尾。 同样,这必须为每一行复制。

我用 for 循环编写了以下代码,它工作正常。但是执行起来需要很多时间。 需要帮助将其转换为 lambda 函数或任何类似的快速执行代码。

for j in range(0,len(Overall_list)):
    print(j)
    List = []
    for i in Overall_list['Nbr_Cells'][j]:
        if(i.split("-")[2] == Overall_list['cellid'][j].split("-")[2]):
            List.append(i)
    Overall_list['Sub_Nbr_List'][j] = List

【问题讨论】:

    标签: python performance lambda nested-loops


    【解决方案1】:

    您的代码的主要瓶颈是您正在多次评估Overall_list['cellid'][j].split("-")[2],而您只能在嵌套循环之外获得一次匹配值。迭代项目通常比按索引引用项目更快。此外,您可以使用列表推导而不是第二个循环:

    for j,list_item in enumerate(Overall_list):
        print(j)
        match = list_item['cellid'].split("-")[2]
        List  = [ i for i in list_item['Nbr_Cells'] if i.split("-")[2] == match ]
        list_item['Sub_Nbr_List'] = List
    

    【讨论】:

    • 这完全有道理阿兰。感谢您的答复。这工作得很好。我也尝试使用类似的逻辑在下面的函数中的循环之外进行匹配情况.. def function(a,b): List = [] for i in a: try: if(i.endswith(b)): List.append(i) except: List = [] return List Overall_list['Sub_Nbr_List'] = Overall_list.apply(lambda x: function(x.Nbr_Cells,x.Pattern), axis =1)
    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2020-11-26
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多