我有一个带有Reddit数据的dataframe,包括一个作者和一个subreddit字段。我想要得到每个作者的分布,他/她在每个子subreddit中发布的频率,可以与其他作者的分布进行比较。
sub_visits = df.groupby('author').subreddit.value_counts()/df.groupby('author').subreddit.count()
这一行给出了一个多索引的pandas数据帧,其中作者是第一个索引。然后是作者活跃的所有子subreddit,作为第二个索引,最后为他们在该子subreddit中的帖子部分赋值。
这很好,但我希望每个作者的分布长度相等。
为此,我将来自整个df的所有子rows (而不仅仅是作者访问的那些)包含在一个数据帧中,其中作者作为行。然后我用零填充它,然后用sub_visits中的值填充。
从技术上讲,这个for循环适用于此。
pdf = pd.DataFrame(index = df.author.unique(),columns = all_subs)
pdf = pdf.fillna(0)
for idx, df_select in sub_visits.groupby(level=[0, 1]):
pdf.loc[idx[0],idx[1]] = df_select[0]
然而,对于仅仅填充值来说,它是相当慢的。我想知道是否有更好的方法来做这件事?或者创建分布,或者填充值。
非常感谢
发布于 2020-07-15 11:40:31
在挣扎了相当长的一段时间后,我偶然找到了答案。它实际上相当简单,但我发现它并不容易找到,所以我希望这个问题可以帮助其他人解决同样的问题。这样一个分布矩阵(这里是在‘作者’中的'subreddit‘)在pandas中的一个组内的矩阵可以通过以下命令快速获得:
sub_visits = df.groupby('author').subreddit.value_counts()/df.groupby('author').subreddit.count()
sub_visits = sub_visits.unstack(-1)
sub_visits = sub_visits.fillna(0)
https://stackoverflow.com/questions/62898126
复制