![](/img/trans.png)
[英]Python Pandas Count columns with multiple conditions and groupby
[英]Pandas Groupby and cumsum with multiple conditions and columns - Python
我有以下數據框:
import pandas as pd
hits = {'id': ['A','A','A','A','A','A','B','B','B','C','C','C'],
'datetime': ['2010-01-02 03:00:00','2010-01-02 03:00:14','2010-01-02 03:00:35','2010-01-02 03:00:38',
'2010-01-02 03:29:10','2010-01-02 03:29:35','2010-01-02 03:45:20','2010-01-02 06:10:05',
'2010-01-02 06:10:15','2010-01-02 07:40:15','2010-01-02 07:40:20','2010-01-02 07:40:25'],
'uri_len': [10,20,25,15,20,10,20,25,15,30,40,45]
}
df = pd.DataFrame(hits, columns = ['id', 'datetime','uri_len'])
df['datetime'] = pd.to_datetime(df['datetime'], format='%Y-%m-%d %H:%M:%S')
print (df)
id datetime uri_len
0 A 2010-01-02 03:00:00 10
1 A 2010-01-02 03:00:14 20
2 A 2010-01-02 03:00:35 25
3 A 2010-01-02 03:00:38 15
4 A 2010-01-02 03:29:10 20
5 A 2010-01-02 03:29:35 10
6 B 2010-01-02 03:45:20 20
7 B 2010-01-02 06:10:05 25
8 B 2010-01-02 06:10:15 15
9 C 2010-01-02 07:40:15 30
10 C 2010-01-02 07:40:20 40
11 C 2010-01-02 07:40:25 45
我想按會話對點擊進行分組,使用id
作為按變量分組。 對我來說,一個會話是一個超過 15 秒的不活動期(從datetime
列計算),或者uri_len
列的減少,並且在這兩種情況下比較連續的命中。
我知道如何分別按每個條件分組:
df['session1'] = (df.groupby('id')['datetime']
.transform(lambda x: x.diff().gt('15Sec').cumsum())
)
df['session2'] = (df.groupby('id')['uri_len']
.transform(lambda x: x.diff().lt(0).cumsum())
)
有沒有辦法在同一行中組合兩個轉換,所以輸出直接是這樣的?:
id datetime uri_len session
0 A 2010-01-02 03:00:00 10 0
1 A 2010-01-02 03:00:14 20 0
2 A 2010-01-02 03:00:35 25 1
3 A 2010-01-02 03:00:38 15 2
4 A 2010-01-02 03:29:10 20 3
5 A 2010-01-02 03:29:35 10 4
6 B 2010-01-02 03:45:20 20 0
7 B 2010-01-02 06:10:05 25 1
8 B 2010-01-02 06:10:15 15 2
9 C 2010-01-02 07:40:15 30 0
10 C 2010-01-02 07:40:20 40 0
11 C 2010-01-02 07:40:25 45 0
如果我理解正確,您要添加它們嗎?
df['session'] = df.groupby('id')['datetime'].transform(lambda x:
x.diff().gt('15Sec').cumsum()) + df.groupby('id')['uri_len'].transform(lambda x:
x.diff().lt(0).cumsum())
更清晰的方法:
s1 = df.groupby('id')['datetime'].transform(lambda x:
x.diff().gt('15Sec').cumsum())
s2 = df.groupby('id')['uri_len'].transform(lambda x: x.diff().lt(0).cumsum())
df['session'] = s1+s2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.