Pandas在groupby中得到共生的二进制计数

时间:2017-12-12 17:13:15

标签: python pandas

好吧,这就是我现在困扰了几天的事情。

假设我有以下数据帧格式的用户互动数据:

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功能我还没有熟悉。

2 个答案:

答案 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.floornunique

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