使用python过滤和替换模式上的列值

2024-04-26 03:17:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧(这里只有前几行):

event_timestamp      message_number  an_robot
2015-04-15 12:09:39  10125            robot_7
2015-04-15 12:09:41  10053            robot_4
2015-04-15 12:09:44  10156_added      robot_7
2015-04-15 12:09:47  20205            robot_108
2015-04-15 12:09:51  10010            robot_38
2015-04-15 12:09:54  10012            robot_65
2015-04-15 12:09:59  10011            robot_39

和(仅前两行,序列行中项目的最大长度为此类字符串值的5):

sequence             support
10053,10156,20205    0.94783
10010,10012          0.93322

我想在第二个数据帧中出现的序列上过滤第一个数据帧。我有一个接一个的密码:

def find_drops(seq, df):
    if seq:
        m = np.logical_and.reduce([df.message_number.shift(-i).eq(seq[i]) for i in range(len(seq))])
        if len(seq) == 1:
            return pd.Series(m, index=df.index)
        else:
            return pd.Series(m, index=df.index).replace({False: np.NaN}).ffill(limit=len(seq)-1).fillna(False)
    else:
        return pd.Series(False, index=df.index)

如果我运行df1[~find_drops([10053,10156_added,20205], df1)],我的结果是正确的,如下所示:

event_timestamp      message_number  an_robot
2015-04-15 12:09:39  10125            robot_7
2015-04-15 12:09:51  10010            robot_38
2015-04-15 12:09:54  10012            robot_65
2015-04-15 12:09:59  10011            robot_39

然而,过滤太苛刻了。我想在数据集中保留一行,告诉我序列确实发生了(我的总体目标是事件日志摘要)。有这样的东西会很好,我们将消息\u编号和一个\u robot值合并到一行,图像都发生在序列出现的第一个时间戳上:

event_timestamp      message_number           an_robot
2015-04-15 12:09:39  10125                    robot_7
2015-04-15 12:09:41  10053,10156_added,20205  robot_4,robot_7,robot_108
2015-04-15 12:09:51  10010,10012              robot_38,robot_65
2015-04-15 12:09:59  10011                    robot_39

或者,只要出现一个新的序列,我们就可以从0到len(df2)开始计数(因为我总是可以通过索引在df2中查找0代表什么):

event_timestamp      message_number    an_robot
2015-04-15 12:09:39  10125              robot_7
2015-04-15 12:09:41  0                  robot_4,robot_7,robot_108
2015-04-15 12:09:51  1                  robot_38,robot_65
2015-04-15 12:09:59  10011              robot_39

我真的不知道如何改变我的功能来做到这一点。另外,如果我可以直接键入df(find_drops(df1.iloc[0,0], df)],那就太好了,因为我可以为df1.iloc[0,0], df1.iloc[1,0]等创建一个循环。。因为我在df2中有大约500个这样的序列。对于我已经编写的函数,我也没有找到这样做的方法。你知道吗

我希望任何人都知道我错过了什么!你知道吗


Tags: 数据aneventnumbermessagedfaddedindex