繁体   English   中英

Pandas groupby 然后根据groups排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM