在pandas中更有效地使用变换



我有以下数据框架:

我想创建一个新的列来计算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按iptimestamp排序,以确保它正确工作。通过在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

最新更新