pandas如何将下一行内容作为条件生成自定义布尔列
跨行匹配的布尔列实现方案
不需要逐行循环判断,借助pandas的向量化移位操作即可高效完成,大体积日志场景下也能保持很快的处理速度。
实现逻辑
- 第一重判断:当前行的消息内容包含
EXPRESSION_1 - 第二重判断:当前行的紧接下一行消息内容包含
EXPRESSION_2 - 两个判断同时满足时,新列的值为
True,其余情况为False
完整可运行代码
import pandas as pd EXPRESSION_1 = 'Starts streaming the stream rtspsrc' EXPRESSION_2 = 'initializing gst pipeline' df = pd.DataFrame( { 'message': [ 'Some log text', 'Some log text', 'Starts streaming the stream rtspsrc', 'Some log text', 'Some log text', 'Starts streaming the stream rtspsrc', 'initializing gst pipeline', 'Some log text', ] } ) # 计算匹配掩码1:当前行匹配EXPRESSION_1 match_current_exp1 = df['message'].str.contains(EXPRESSION_1, na=False) # 计算匹配掩码2:下一行匹配EXPRESSION_2 # shift(-1)表示列向上偏移1位,让i位置的内容对应原df的i+1行 # fill_value=False用于处理最后一行没有下一行的边界场景 match_next_exp2 = df['message'].str.contains(EXPRESSION_2, na=False).shift(-1, fill_value=False) # 两个条件同时满足才赋值为True df['process_started'] = match_current_exp1 & match_next_exp2
输出结果
和预期效果完全一致:
message process_started 0 Some log text False 1 Some log text False 2 Starts streaming the stream rtspsrc False 3 Some log text False 4 Some log text False 5 Starts streaming the stream rtspsrc True 6 initializing gst pipeline False 7 Some log text False
注意事项
- 注意
shift的方向:shift(1)是取当前行的上一行值,shift(-1)才是取下一行的值,方向写反会导致结果完全错误。 - 使用
str.contains代替逐行apply的字符串查找,属于向量化操作,处理十万行以上的大日志时,速度比逐行lambda快一个数量级。 na=False参数用于避免消息列存在空值(NaN)时,字符串匹配返回空值,保证最终列是纯布尔类型。- 边界场景处理:最后一行没有下一行,通过
fill_value=False统一填充,不会出现空值影响判断。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

