通过唯一行值明确查询Pandas DataFrame的多个条件

时间:2015-10-31 21:04:40

标签: performance python-2.7 numpy pandas

我有DataFrame个事件日志:

eventtime, eventname, user, execution_in_s, delta_event_time

事件名称,例如可以是" new_order","登录"或者" update_order"。

我的问题是,我想知道不同用户在eventname == "error"login之间的句点中是否update_order。我的一段时间有一个开始时间和一个结束时间。 在我今天早上尝试之前,这一切听起来都很容易。

对于24小时日志的时间范围,我可能没有一对,因为登录可能是昨天发生的。我不知道如何处理类似的事情。

delta_event_time是事件时间的计算列减去executions_in_s。我正在考虑这些真正的时间戳。我计算了它们:

event_frame["delta_event_time"] = event_frame["eventtime"] - pandas.to_timedelta(event_frame["execution_in_s"], unit='s')

我试过这样的事情:

events_keys = numpy.array(["login", "new_order"])
users = numpy.unique(event_frame["user"])

for user in users:
    event_name = event_frame[event_frame["eventname"].isin(events_keys) & event_frame["user" == user]]["event_name"]

但这不使用时间段。

我知道Pandas有between_time()但我不知道如何按用户查询带有句点的DataFrame。

我是否需要使用.iterrows()迭代DataFrame来计算开始和结束时间图?这需要花费很多时间,仅仅是为了尝试基本的东西。我不知何故认为这会让Pandas无法完成这项任务。

我尝试event_frame.sort(["user", "eventname"]),效果很好,以便我可以看到相关的行。我对.groupby("user")没有任何好运,因为它混合了用户,尽管它们是唯一的行值。

也许更好的工作流解决方案是将DataFrame转储到MongoDB中,而不是在这种情况下使用Pandas来执行分析。我不确定,因为我是框架的新手。

1 个答案:

答案 0 :(得分:1)

这是我认为可以解决您的问题的伪代码。如果您共享数据样本,我会更新它。

hashCode()

最好的方法可能是创建一个进行比较的函数。因为那样你就可以通过声明grouped = event_frame.groupby('user') # This should work. # I cannot believe that it didn't work for you! I won't buy it till you show us proof! for name, group in grouped: group.set_index('eventtime') # This will make it easier to work with time series. # I am changing index here because different users may have similar or # overlapping times, and it is a pain in the neck to resolve indexing conflicts. login_ind = group[group['eventname'] == 'login'].index error_ind = group[group['eventname'] == 'error'].index update_ind = group[group['eventname'] == 'update_order'].index # Here you can compare the lists login_ind, error_ind and update_ind however you wish. # Note that the list can even have a length of 0. # User name is stored in the variable name. So you can get it from there. 来创建一个dict。 然后在error_user = {}内调用您的函数,如下所示:for name, group in grouped: