使用python根据条件选择两行或多行连续行 [英] Select two or more consecutive rows based on a criteria using python

查看:12
本文介绍了使用python根据条件选择两行或多行连续行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的数据集:

user        time              city    cookie    index
A        2019-01-01 11.00     NYC     123456      1
A        2019-01-01 11.12     CA      234567      2 
A        2019-01-01 11.18     TX      234567      3
B        2019-01-02 12.19     WA      456789      4 
B        2019-01-02 12.21     FL      456789      5
B        2019-01-02 12.31     VT      987654      6
B        2019-01-02 12.50     DC      157890      7
A        2019-01-03 09:12     CA      123456      8
A        2019-01-03 09:27     NYC     345678      9
A        2019-01-03 09:34     TX      123456      10
A        2019-01-04 09:40     CA      234567      11

在此数据集中,我要比较并选择符合以下条件的两个或多个连续

  1. 用户应相同
  2. 时差应小于15分钟
  3. Cookie应该不同

因此,如果我应用筛选器,我应该会获得以下数据:

user        time              city    cookie    index
A        2019-01-01 11.00     NYC     123456      1
A        2019-01-01 11.12     CA      234567      2 
B        2019-01-02 12.21     FL      456789      5
B        2019-01-02 12.31     VT      987654      6
A        2019-01-03 09:12     CA      123456      8
A        2019-01-03 09:27     NYC     345678      9
A        2019-01-03 09:34     TX      123456      10
因此,在上面的比较中,前两行(索引1和2)满足上述所有条件。接下来的两个(索引2和索引3)具有相同的cookie,索引3和4具有不同的用户,5和6被选择并显示,6和7具有超过15分钟的时间差。8、9和10符合标准,但11不符合,因为日期相隔24小时。

如何使用python dataframe解决此问题?所有的帮助我们都很感激。


我尝试的内容:

我尝试使用

创建标志

Shift()

cookiediff=pd.DataFrame(df.Cookie==df.Cookie.shift())
cookiediff.columns=['Cookiediffs']
timediff=pd.DataFrame(pd.to_datetime(df.time) - pd.to_datetime(df.time.shift()))
timediff.columns=['timediff']
mask = df.user != df.user.shift(1)

timediff.timediff[mask] = np.nan
cookiediff['Cookiediffs'][mask] = np.nan

推荐答案

这将起作用:

import numpy as np

#you have inconsistent time delim-just to correct it per your sample data
df["time"]=df["time"].str.replace(":", ".")
df["time"]=pd.to_datetime(df["time"], format="%Y-%m-%d %H.%M")

cond_=np.logical_or(
    df["time"].sub(df["time"].shift()).astype('timedelta64[m]').lt(15) &
    df["user"].eq(df["user"].shift()) &
    df["cookie"].ne(df["cookie"].shift()), 
    df["time"].sub(df["time"].shift(-1)).astype('timedelta64[m]').lt(15) &
    df["user"].eq(df["user"].shift(-1)) &
    df["cookie"].ne(df["cookie"].shift(-1)), 
)

res=df.loc[cond_]
几点-您需要确保time列是datetime,才能使15分钟的条件可验证。 THEN-通过将每一行与上一行进行比较,检查所有3个条件或,但对照下一行进行检查,获得最终筛选(cond_)(否则,您将只获得除第一行之外的所有连续匹配行)。

输出:

  user                time city  cookie  index
0    A 2019-01-01 11:00:00  NYC  123456      1
1    A 2019-01-01 11:12:00   CA  234567      2
4    B 2019-01-02 12:21:00   FL  456789      5
5    B 2019-01-02 12:31:00   VT  987654      6
7    A 2019-01-03 09:12:00   CA  123456      8
8    A 2019-01-03 09:27:00  NYC  345678      9
9    A 2019-01-03 09:34:00   TX  123456     10

这篇关于使用python根据条件选择两行或多行连续行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆