我有以下輸入df:
domain ip timestamp
0 Google 101 2020-04-01 23:01:41
1 Google 101 2020-04-01 23:01:59
2 Google 101 2020-04-02 12:01:41
3 Facebook 101 2020-04-02 13:11:33
4 Facebook 101 2020-04-02 13:11:35
5 Youtube 103 2020-04-21 13:01:41
6 Youtube 103 2020-04-21 13:11:46
7 Youtube 103 2020-04-22 01:01:01
8 Google 103 2020-04-22 02:11:23
9 Facebook 103 2020-04-23 14:11:13
10 Youtube 103 2020-04-23 14:11:55
我怎樣才能得到這個輸出?domain_num每次域在 IP 內切換時都會增加的迭代器在哪里。
domain ip timestamp domain_num
0 Google 101 2020-04-01 23:01:41 1
1 Google 101 2020-04-01 23:01:59 1
2 Google 101 2020-04-02 12:01:41 1
3 Facebook 101 2020-04-02 13:11:33 2
4 Facebook 101 2020-04-02 13:11:35 2
5 Youtube 103 2020-04-21 13:01:41 1
6 Youtube 103 2020-04-21 13:11:46 1
7 Youtube 103 2020-04-22 01:01:01 1
8 Google 103 2020-04-22 02:11:23 2
9 Facebook 103 2020-04-23 14:11:13 3
10 Youtube 103 2020-04-23 14:11:55 4
我嘗試了類似這樣的方法,但我需要按 ip 對其進行分組
df['domain'].ne(df['domain'].shift()).cumsum()
下面的代碼出錯了
df.groupby('ip').apply(lambda x : x[x.domain.ne(x.domain.shift().cumsum())])
資料
import pandas as pd
data = {'domain':['Google', 'Google', 'Google', 'Facebook', 'Facebook', 'Youtube', 'Youtube', 'Youtube', 'Google', 'Facebook', 'Youtube'],
'ip':[101, 101, 101, 101, 101, 103, 103, 103, 103, 103, 103],
'timestamp' : ['2020-04-01 23:01:41', '2020-04-01 23:01:59', '2020-04-02 12:01:41', '2020-04-02 13:11:33',
'2020-04-02 13:11:35', '2020-04-21 13:01:41', '2020-04-21 13:11:46',
'2020-04-22 01:01:01', '2020-04-22 02:11:23','2020-04-23 14:11:13', '2020-04-23 14:11:55' ]}
df = pd.DataFrame(data)
df['timestamp']= pd.to_datetime(df['timestamp'])
uj5u.com熱心網友回復:
假設您的資料框按timestamp列排序:
inc_domain_num = lambda x: x.ne(x.shift()).cumsum()
df['domain_num'] = df.groupby('ip')['domain'].apply(inc_domain_num)
print(df)
# Output
domain ip timestamp domain_num
0 Google 101 2020-04-01 23:01:41 1
1 Google 101 2020-04-01 23:01:59 1
2 Google 101 2020-04-02 12:01:41 1
3 Facebook 101 2020-04-02 13:11:33 2
4 Facebook 101 2020-04-02 13:11:35 2
5 Youtube 103 2020-04-21 13:01:41 1
6 Youtube 103 2020-04-21 13:11:46 1
7 Youtube 103 2020-04-22 01:01:01 1
8 Google 103 2020-04-22 02:11:23 2
9 Facebook 103 2020-04-23 14:11:13 3
10 Youtube 103 2020-04-23 14:11:55 4
uj5u.com熱心網友回復:
假設ip正確分組(不一定按排序順序),首先找到您想要增加的所有位置:
df['domain_num'] = (df['domain'] != df['domain'].shift(1)) | (df['ip'] != df['ip'].shift(1))
現在將其替換為累積總和,但對于每個組是獨立的:
df['domain_num'] = df.groupby('ip')['domain_num'].cumsum()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/414793.html
標籤:
