好吧,这就是我现在困扰了几天的事情。
假设我有以下数据帧格式的用户互动数据:
user_id_a | user_id_b | time
2 5 2017-12-12 14:00
1 7 2017-12-12 14:20
2 5 2017-12-12 14:40
2 5 2017-12-13 11:00
4 12 2017-12-15 9:00
我想要一个二进制计数的总和,它是否在某个时间范围内相互作用...所以例如,如果时间范围是1天,我想最终得到:
user_id_a | user_id_b | num_time_frames_seen_together
2 5 2
1 7 1
4 12 1
因为在这种情况下,虽然用户2和5总共交互3次,但其中2次交互是在同一时间范围内,因此只有一个值加上了他们的总数。
我得到了:
df = df.set_index('time').groupby(pd.Grouper(freq='1D'))
这基本上给了我第一个示例表。但我真的不知道下一步该做什么。我对Pandas很新,虽然我知道我可以遍历行并手动计算,但我很确定必须有某种Pandas功能我还没有熟悉。
答案 0 :(得分:0)
不是最漂亮的,但即使你有2,5和5,这也可以工作(这些应该算作我假设的同一对人)。
致电groupby
后,请致电apply
+ value_counts
,获取日期计数。然后,您可以使用sum
汇总日期。
df = df.set_index('time')\
.groupby(pd.Grouper(freq='1D'))\
.apply(lambda x: x.apply(frozenset, 1).value_counts() > 0)\
.sum(level=1)
df
(2, 5) 2.0
(1, 7) 1.0
(4, 12) 1.0
dtype: float64
答案 1 :(得分:0)
让我们使用dt.floor
和nunique
:
df.assign(day = df['time'].dt.floor('D')).groupby(['user_id_a','user_id_b'])['day'].nunique()\
.reset_index(name='num_seen_together')
输出:
user_id_a user_id_b num_seen_together
0 1 7 1
1 2 5 2
2 4 12 1