2016-08-24 4 views
1

У меня есть последовательность сообщений электронной почты, упорядоченная по методу timestamp и user_id.Python - подсчет последовательных частот по группе

Я хочу исследовать, как часто по электронной почте я следил по электронной почте j. Я собираюсь отображать эти частоты среди пользователей на карте тепла, чтобы показать самый общий путь.

a = """timestamp,email,subject 
2016-07-01 10:17:00,[email protected],subject2 
2016-07-01 02:01:02,[email protected],welcome 
2016-07-01 14:45:04,[email protected],subject3 
2016-07-01 08:14:02,[email protected],subject1 
2016-07-01 16:26:35,[email protected],subject4 
2016-07-01 10:17:00,[email protected],subject1 
2016-07-01 02:01:02,[email protected],welcome 
2016-07-01 14:45:04,[email protected],subject3 
2016-07-01 08:14:02,[email protected],subject2 
2016-07-01 16:26:35,[email protected],subject4 
2016-07-01 18:00:00,[email protected],welcome 
2016-07-01 19:00:02,[email protected],subject1 
2016-07-01 20:00:04,[email protected],subject3 
2016-07-01 21:14:02,[email protected],subject4 
2016-07-01 21:26:35,[email protected],subject2 
""" 

import pandas as pd 
from pandas.io.parsers import StringIO 
df1 = pd.read_csv(StringIO(a), parse_dates=['timestamp']) 
df1=df1.sort_values(['email','timestamp']) 

отсортированный df1:

 timestamp  email subject 
1 2016-07-01 02:01:02 [email protected] welcome 
3 2016-07-01 08:14:02 [email protected] subject1 
0 2016-07-01 10:17:00 [email protected] subject2 
2 2016-07-01 14:45:04 [email protected] subject3 
4 2016-07-01 16:26:35 [email protected] subject4 
6 2016-07-01 02:01:02 [email protected] welcome 
8 2016-07-01 08:14:02 [email protected] subject2 
5 2016-07-01 10:17:00 [email protected] subject1 
7 2016-07-01 14:45:04 [email protected] subject3 
9 2016-07-01 16:26:35 [email protected] subject4 
10 2016-07-01 18:00:00 [email protected] welcome 
11 2016-07-01 19:00:02 [email protected] subject1 
12 2016-07-01 20:00:04 [email protected] subject3 
13 2016-07-01 21:14:02 [email protected] subject4 
14 2016-07-01 21:26:35 [email protected] subject2 

Вывод должен выглядеть следующим образом

  welcome subject1 subject2 subject3 subject4 
welcome  0    
subject1  2   0      
subject2  1   1   0  
subject3  0   2   1   0 
subject4  0   0   0   3    0 

Другими словами, было 2 вхождений, где subject1 последовало после приветственного письма. Было 1 случай, когда предмет 2 следовал после приветственного сообщения и т. Д.

Каков наилучший способ сделать это?

+0

Вы можете объяснить свой результат? он выглядит как subject4, и приветствие должно иметь 1 не 0 – depperm

+0

Отредактировано стол. Надеюсь, теперь это ясно. – TinaW

ответ

1

Два лайнера (которые вы можете сжать до однострочника):

df1['next_subject'] = df1.groupby('email')['subject'].shift(-1) 
res = pd.crosstab(df1['next_subject'], df1['subject']) 
print(res) 

# subject  subject1 subject2 subject3 subject4 welcome 
# next_subject             
# subject1    0   1   0   0  2 
# subject2    1   0   0   1  1 
# subject3    2   1   0   0  0 
# subject4    0   0   3   0  0 

Вы можете массировать это немного, чтобы получить его в точной форме вы цитируете в OP:

subjects = ['welcome'] + ['subject{}'.format(i) for i in range(1, 5)] 
res = res.loc[subjects, subjects].fillna(0).astype(int) 
print(res) 

# subject  welcome subject1 subject2 subject3 subject4 
# next_subject             
# welcome    0   0   0   0   0 
# subject1   2   0   1   0   0 
# subject2   1   1   0   0   1 
# subject3   0   2   1   0   0 
# subject4   0   0   0   3   0 
Смежные вопросы