返回multiindex中每个第一行/观测值的计数



我有一个多索引数据框架:

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

这对于模型知道从哪个页面到哪个页面是有用的,也许一个简单的马尔可夫链是一个很好的开始。

最新更新