Python 需要识别所有ID';在+;/-窗口中创建的使用pandas使用相同的用户id进行10分钟的约会

Python 需要识别所有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: 我正试

需要识别在+/-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: 我正试图用熊猫来解决这个问题。请提供一些关于如何实现这一点的输入,数据量将增加到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