用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] = ""
尝试添加示例:
bla bla短信\ n
有关问题所在位置的详细信息\ n
关于其他东西的详细信息\ n
bla bla短信类型2 xxxxxx \ n
bla bla短信类型3 xxxxxx \ n
此物品的位置详细信息\ n
该物品的位置详细信息\ n
我的价格详情\ n
您的价格详情\ n
很多\ n
更多\ n
无聊的\ n
文字\ n
bla bla短信类型2 xxxxxx \ n
所以上面是4条不同的消息,长度不同,我想连接文本,所以每条消息有一行,其中包含从头到尾的所有信息
答案 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-您的问题已更改,我不太确定这对您有帮助。