我有以下数据框架:
我想创建一个新的列来计算IP切换域的次数。
输入:
domain ip timestamp next_domain next_next_domain
0 Google 101 2020-04-01 23:01:41 Facebook N/A
1 Google 101 2020-04-01 23:01:59 Facebook N/A
2 Google 101 2020-04-02 12:01:41 Facebook N/A
3 Facebook 101 2020-04-02 13:11:33 N/A N/A
4 Facebook 101 2020-04-02 13:11:35 N/A N/A
5 Youtube 103 2020-04-21 13:01:41 Google Facebook
6 Youtube 103 2020-04-21 13:11:46 Google Facebook
7 Youtube 103 2020-04-22 01:01:01 Google Facebook
8 Google 103 2020-04-22 02:11:23 Facebook Youtube
9 Facebook 103 2020-04-23 14:11:13 Youtube N/A
10 Youtube 103 2020-04-23 14:11:55 N/A N/A
我有以下代码,它给了我以下输出:
df['switch'] = df.groupby('ip')['domain'].transform(lambda x: x.shift().ne(x).sum()-1)
输出:
domain ip timestamp next_domain next_next_domain switch_count
0 Google 101 2020-04-01 23:01:41 Facebook N/A 1
1 Google 101 2020-04-01 23:01:59 Facebook N/A 1
2 Google 101 2020-04-02 12:01:41 Facebook N/A 1
3 Facebook 101 2020-04-02 13:11:33 N/A N/A 1
4 Facebook 101 2020-04-02 13:11:35 N/A N/A 1
5 Youtube 103 2020-04-21 13:01:41 Google Facebook 3
6 Youtube 103 2020-04-21 13:11:46 Google Facebook 3
7 Youtube 103 2020-04-22 01:01:01 Google Facebook 3
8 Google 103 2020-04-22 02:11:23 Facebook Youtube 3
9 Facebook 103 2020-04-23 14:11:13 Youtube N/A 3
10 Youtube 103 2020-04-23 14:11:55 N/A N/A 3
IP 101切换1次,因为它从Google ->Facebook。IP 103切换了3次,因为它从Youtube ->谷歌→Facebook→Youtube。
我有以下解决方案使用"transform"但是在我的数据集上运行需要很长时间。是否有一种不使用转换或应用的更快更有效的解决方案?
我认为你可以事先计算差异(因为无论如何你减去1)。然而,这需要df按ip
和timestamp
排序,以确保它正确工作。通过在groupby
之外执行此操作,它应该明显更快。
df['switch_count'] = df['domain'].shift().ne(df['domain'])
df['switch_count'] = df.groupby('ip')['switch_count'].transform('sum') - 1
domain ip timestamp next_domain next_next_domain switch_count
0 Google 101 2020-04-01 23:01:41 Facebook NaN 1
1 Google 101 2020-04-01 23:01:59 Facebook NaN 1
2 Google 101 2020-04-02 12:01:41 Facebook NaN 1
3 Facebook 101 2020-04-02 13:11:33 NaN NaN 1
4 Facebook 101 2020-04-02 13:11:35 NaN NaN 1
5 Youtube 103 2020-04-21 13:01:41 Google Facebook 3
6 Youtube 103 2020-04-21 13:11:46 Google Facebook 3
7 Youtube 103 2020-04-22 01:01:01 Google Facebook 3
8 Google 103 2020-04-22 02:11:23 Facebook Youtube 3
9 Facebook 103 2020-04-23 14:11:13 Youtube NaN 3
10 Youtube 103 2020-04-23 14:11:55 NaN NaN 3