如何在Python中删除慢循环并使用Lambda或其他方法代替

时间:2019-02-08 16:16:13

标签: python loops lambda

用lambda或其他东西代替循环以提高运行速度

我有一个有效的循环,但是对于我的真实数据集来说,它太慢了 我基本上有一个巨大的文本文件,每行用\ n个字符分隔。

每个唯一消息的开头都有一个独特的消息指纹,为此,我们假设它们以#开头。我已经将这个#(Y)或不是(N)的出现放在单独的列中,称为“开始”

我想查找不是以#开头的行,如果下面的行也不是以#开头,我想将两者并列。暂时不要理会\ ns,我已经解决了。

我的循环有效,但是我该如何使用lambda函数或其他任何方式来达到良好的速度呢?

非常感谢

for i in range(2,(len(df)-1)):
    if ((df['Beginning'][i] == 'N') and (df['Beginning'][i+1] == 'N')):
        df['Message'][i] = df['Message'][i]  +  df['Message'][i+1]
        df['Message'][i+1] = ""

尝试添加示例:

消息从现在开始01:01:2018:12:15:28 \ n

bla bla短信\ n

有关问题所在位置的详细信息\ n

关于其他东西的详细信息\ n

Message-begins-now 01:01:2018:12:16:78 \ n

bla bla短信类型2 xxxxxx \ n

Message-begins-now 01:01:2018:12:21:05 \ n

bla bla短信类型3 xxxxxx \ n

此物品的位置详细信息\ n

该物品的位置详细信息\ n

我的价格详情\ n

您的价格详情\ n

很多\ n

更多\ n

无聊的\ n

文字\ n

消息从现在开始01:01:2018:12:35:01 \ n

bla bla短信类型2 xxxxxx \ n

所以上面是4条不同的消息,长度不同,我想连接文本,所以每条消息有一行,其中包含从头到尾的所有信息

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是df.shift()

例如,您可以将迭代和if语句替换为以下内容:

df[(df['Beginning'] == df['Beginning'].shift(1)) & (df['Beginning'] == 'N')]

或(我实际上会做什么)

mask = (df['Beginning'] == df['Beginning'].shift(1)) & (df['Beginning'] == 'N')

df.loc[mask, 'Message'] = df.loc[mask, 'Message'] + df.loc[mask, 'Message'].shift(1)  # you'd have to check that this is what you want, perhaps you need to shift the mask rather than the df, i'm not sure

编辑:哎呀,错别字

编辑2-您的问题已更改,我不太确定这对您有帮助。