我有一个多索引数据框架:
pid time
id_main id_sub
id_1 sub_id1 pid1 t1
sub_id3 pid2 t2
sub_id9 pid3 t3
. . .
. . .
id_2 sub_id2 pid_1 t1
sub_id3 pid_1 t2
. . .
. . .
<<p>上下文/strong>:每个id_main
是用户个人会话id,pid
是包含"路径"的字符串;用户旅行的位置(当然是按时间排序)
df = df.set_index ([' main_id ', ' sub_id ']) '
df = df.sort_values(时间)
:我想找到每一个第一pid的每一个会话计数。所以我本质上想要有一个以pid
为索引的序列(所以我可以在其他地方合并它)和一个单独的列,其中每个(id_1, id_2, ... , id_n)
会话中每个pid
首先出现的次数。然后稍微复杂一点,但我希望创建另一个数据框,根据会话id (id_main
),每个页面的出现次数,然后第二个索引包含所有pids
和它们的相对计数。所以基本上,我需要每个会话的第一次出现,对于每个第一个pids
,我希望有它们各自下一步的计数。
查找每个会话第一页的行:
>>> df.groupby('id_main')['time'].idxmin()
id_main
id1 (id1, sub0)
id2 (id2, sub7)
id3 (id3, sub5)
Name: time, dtype: object
所以第一页出现的次数:
>>> df.loc[df.groupby('id_main')['time'].idxmin(), 'pid'].value_counts()
pid8 1
pid13 1
pid1 1
Name: pid, dtype: int64
当然,在这个例子中,我只有3个用户,每个用户从不同的页面开始。
然后您想要每个会话中每个页面的出现次数(您可以潜在地添加.unstack('pid')
):
>>> df.groupby('id_main')['pid'].value_counts()
id_main pid
id1 pid14 1
pid5 1
pid8 1
id2 pid13 1
pid15 1
pid5 1
id3 pid1 1
pid10 1
pid11 1
pid14 1
pid15 1
pid7 1
Name: pid, dtype: int64
如果你想知道页面转换,即从哪一页到下一页,你可以这样做:
>>> df.sort_values('time').groupby('id_main')['pid'].shift().to_frame('from_pid').join(df.sort_values('time')['pid'].rename('to_pid'))
from_pid to_pid
id_main id_sub
id3 sub5 NaN pid1
sub1 pid1 pid14
id2 sub7 NaN pid13
id1 sub0 NaN pid8
sub8 pid8 pid5
id3 sub0 pid14 pid7
id1 sub4 pid5 pid14
id3 sub4 pid7 pid11
id2 sub2 pid13 pid5
id3 sub8 pid11 pid15
sub3 pid15 pid10
id2 sub3 pid5 pid15
这对于模型知道从哪个页面到哪个页面是有用的,也许一个简单的马尔可夫链是一个很好的开始。