[英]Pandas groupby and then sort based on groups
我有一个新闻文章数据集及其相关概念和情绪(检测到 NLP),我想按 2 个字段分组:概念和来源。 简化如下:
>>> df = pandas.DataFrame({'concept_label': [1,1,2,2,3,1,1,1],
'source_uri': ['A','B','A','A','A','C','C','C'],
'sentiment_article': [0.05,0.15,-0.3,-0.2,-0.5,-0.6,-0.3,-0.4]})
concept_label source_uri sentiment_article
1 A 0.05
1 B 0.15
2 A -0.3
2 A -0.2
3 A -0.5
1 C -0.6
1 C -0.3
1 C -0.4
因此,对于“冠状病毒”这个概念,我基本上想知道每个新闻媒体多久写一次有关该主题的文章,以及文章的平均情绪是什么。 上面的 df 将如下所示:
mean count
concept_label source_uri
3 A -0.50 1
2 A -0.25 2
1 A 0.050 1
1 B 0.150 1
1 C -0.43 3
我可以使用以下代码进行分组(df 是 pandas dataframe 我正在使用,concept_label 是概念,source_uri 是新闻媒体):
df_grouped = df.groupby(['concept_label','source_uri'])
df_grouped['sentiment_article'].agg(['mean', 'count'])
这很好用,并为我提供了我需要的值,但是我希望“计数”总数最高的组位于顶部。 我尝试这样做的方法是将其更改为以下内容:
df_grouped = df.groupby(['concept_label','source_uri'])
df_grouped['sentiment_article'].agg(['mean', 'count']).sort_values(by=['count'], ascending=False)
但是,即使按计数排序,它也会再次分解组。 我的结果目前看起来像这样:
mean count
concept_label source_uri
3 A -0.50 1
1 A 0.050 1
1 B 0.150 1
2 A -0.25 2
1 C -0.43 3
我不相信这是最好的答案,但我找到了一种方法。
我首先对总列表进行分组,并将每个概念标签的总计数保存为变量,然后将其与现有的 dataframe 合并。 这样我就可以对该列进行排序,然后根据实际计数进行排序。
#adding count column to existing table
df_grouped = df.groupby(['concept_label'])['concept_label'].agg(['count']).sort_values(by=['count'])
df_grouped.rename(columns={'count':'concept_count'}, inplace=True)
df_count = pd.merge(df, df_grouped, left_on='concept_label', right_on='concept_label')
#sorting
df_sentiment = df_count.groupby(['concept_label','source_uri','concept_count'])['sentiment_article'].agg(['mean', 'count']).sort_values(by=['concept_count','count'], ascending=False)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.