我有两个数据帧(这里只有前几行):
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个这样的序列。对于我已经编写的函数,我也没有找到这样做的方法。你知道吗
我希望任何人都知道我错过了什么!你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐