熊猫分组,然后根据分组排序

时间:2020-06-08 15:34:29

标签: python pandas

我有一个新闻文章及其相关概念和情感(已检测到NLP)的数据集,我想按两个字段进行分组:“概念”和“来源”。简化如下:

>>> 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是我正在使用的熊猫数据框,concept_label是概念,source_uri是新闻媒体):

df_grouped = df.groupby(['concept_label','source_uri'])
df_grouped['sentiment_article'].agg(['mean', 'count'])

这工作得很好,并为我提供了所需的值,但是我希望“ 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

1 个答案:

答案 0 :(得分:0)

我不认为这是最好的答案,但是我找到了一种解决方法。

我首先将总列表分组,然后将每个concept_label的总计数保存为变量,然后与现有数据框合并。这样,我就可以在该列上进行排序,并在实际计数上进行次级排序。

#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)