使用python根据条件选择两行或多行连续行 [英] Select two or more consecutive rows based on a criteria using python
本文介绍了使用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
在此数据集中,我要比较并选择符合以下条件的两个或多个连续:
- 用户应相同
- 时差应小于15分钟
- 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屋!
查看全文