我有一个新闻文章及其相关概念和情感(已检测到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
答案 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)