Python 需要识别所有ID';在+;/-窗口中创建的使用pandas使用相同的用户id进行10分钟的约会
需要识别在+/-10分钟的日期窗口中使用相同用户ID创建的所有IDPython 需要识别所有ID';在+;/-窗口中创建的使用pandas使用相同的用户id进行10分钟的约会,python,pandas,numpy,Python,Pandas,Numpy,需要识别在+/-10分钟的日期窗口中使用相同用户ID创建的所有ID ID|user| Date --|----|------------------- 1 |abc |2020-02-02 10:01:00 2 |abc |2020-02-02 10:09:00 3 |def |2020-02-02 10:17:00 4 |def |2020-02-02 11:00:00 5 |abc |2020-02-02 10:17:00 所需o/p: 我正试
ID|user| Date
--|----|-------------------
1 |abc |2020-02-02 10:01:00
2 |abc |2020-02-02 10:09:00
3 |def |2020-02-02 10:17:00
4 |def |2020-02-02 11:00:00
5 |abc |2020-02-02 10:17:00
所需o/p:
我正试图用熊猫来解决这个问题。请提供一些关于如何实现这一点的输入,数据量将增加到100k记录
采取的办法:
我创建了两列,分别是date_加上_10和date_减10。然后我创建了一个嵌套循环来逐个解析数据,并检查date是否在date_plus_10和date_plus_10之间,并且是否有相同的用户。但这需要很长时间才能完成
在下面的代码中,37和36是日期加10和日期减10的位置,23是日期列,15是用户,38是标志/计数器
范围(0100)内的i的:
time\u range=DateTimeRange(data\u rr\u NAN.iloc[i,37],data\u rr\u NAN.iloc[i,36])
对于范围(i+1100)内的j:
如果((时间范围内的数据rr_NAN.iloc[j,23]=真)和(数据rr_NAN.iloc[j,15]=数据rr_NAN.iloc[i,15]):
data_rr_NAN.iloc[i,38]+=1
我尝试了使用基于时间的窗口大小的.rolling()
操作的一些变体,但它似乎有一系列限制,使其难以用于此用例
下面是一个简单的方法,它迭代数据帧并查找落在窗口中的行。我怀疑有一个更有效的方法来做这件事,但它可能足够快,适合你的情况
import numpy as np
import pandas as pd
create_user_log = np.array(
[[1, pd.Timestamp('20200202 10:01:00'), 'abc'],
[2, pd.Timestamp('20200202 10:09:00'), 'abc'],
[3, pd.Timestamp('20200202 10:17:00'), 'def'],
[4, pd.Timestamp('20200202 11:00:00'), 'def'],
[5, pd.Timestamp('20200202 10:17:00'), 'abc'],
[6, pd.Timestamp('20200202 11:09:00'), 'abc'],
[7, pd.Timestamp('20200202 11:56:00'), 'def'],
[8, pd.Timestamp('20200202 12:00:00'), 'def'],
[9, pd.Timestamp('20200202 12:05:00'), 'abc'],
])
df = pd.DataFrame(data=create_user_log, columns=["id", "date", "user"])
df.set_index('date', inplace=True)
df.sort_index(inplace=True)
counts = []
for row in df.itertuples(index=True, name='Pandas'):
win = df[(row[0] - pd.DateOffset(minutes=10)):(row[0] + pd.DateOffset(minutes=10))]
counts.append(len(win[win['user']==row.user]))
df['cnt'] = counts
display(df)
输出:
id user cnt
date
2020-02-02 10:01:00 1 abc 2
2020-02-02 10:09:00 2 abc 3
2020-02-02 10:17:00 3 def 1
2020-02-02 10:17:00 5 abc 2
2020-02-02 11:00:00 4 def 1
2020-02-02 11:09:00 6 abc 1
2020-02-02 11:56:00 7 def 2
2020-02-02 12:00:00 8 def 2
2020-02-02 12:05:00 9 abc 1
我不喜欢使用
itertuples()
,但是因为我们在日期
上建立了索引,所以每个迭代中完成的工作应该相当快。到目前为止,您是如何解决这个问题的?您的尝试以何种方式失败?为什么ID 2的CNT为2?如果你在同一个用户id内计数,那么只有id=1符合条件,那么CNT不是1吗?@TYZ:是的,你是对的,我已经编辑了样本数据。另外,为什么id 3有CNT 1,id 4有10分钟多的时间,那么它不应该有CNT 0吗?
id user cnt
date
2020-02-02 10:01:00 1 abc 2
2020-02-02 10:09:00 2 abc 3
2020-02-02 10:17:00 3 def 1
2020-02-02 10:17:00 5 abc 2
2020-02-02 11:00:00 4 def 1
2020-02-02 11:09:00 6 abc 1
2020-02-02 11:56:00 7 def 2
2020-02-02 12:00:00 8 def 2
2020-02-02 12:05:00 9 abc 1