如何对最终输出的数据进行排序?

Posted

技术标签:

【中文标题】如何对最终输出的数据进行排序?【英文标题】:How to sort the data wrt final output? 【发布时间】:2020-08-25 01:27:33 【问题描述】:

我想将我的数据框按两列分组,然后对组内的聚合结果进行排序。

In [167]:df

count   job source
0   2   sales   A
1   4   sales   B
2   6   sales   C
3   3   sales   D
4   7   sales   E
5   5   market  A
6   3   market  B
7   2   market  C
8   4   market  D
9   1   market  E
df.groupby(['job','source']).agg('count':sum)
Out[168]:

job     source  count
market  A   5
        B   3
        C   2
        D   4
        E   1
sales   A   2
        B   4
        C   6
        D   3
        E   7

我现在想在每个组中按降序对计数列进行排序。然后只取前三行。得到类似的东西:

job     source  count
market  A   5
        D   4
        B   3
sales   E   7
        C   6
        B   4

我想进一步解决这个问题 w.r.t job,所以如果销售额的总和更多,我希望数据打印为

job     source  count
sales   E   7
        C   6
        B   4
market  A   5
        D   4
        B   3

我无法获得前 5 名的工作

【问题讨论】:

请分享您到目前为止所尝试的内容。 【参考方案1】:

您可以使用在另一个类似答案sorting after aggregation 中提到的sort_valuesjob 再次提到的group 从工作中获得前 N 名,

>>> df
   count     job source
0      2   sales      A
1      4   sales      B
2      6   sales      C
3      3   sales      D
4      7   sales      E
5      5  market      A
6      3  market      B
7      2  market      C
8      4  market      D
9      1  market      E
>>> agg = df.groupby(['job','source']).agg('count':sum)
>>> agg
               count
job    source       
market A           5
       B           3
       C           2
       D           4
       E           1
sales  A           2
       B           4
       C           6
       D           3
       E           7
>>> agg.reset_index().sort_values(['job', 'count'], ascending=False).set_index(['job', 'source']).groupby('job').head(3)
               count
job    source       
sales  E           7
       C           6
       B           4
market A           5
       D           4
       B           3
>>> 

【讨论】:

【参考方案2】:

IIUC,我们可以再做一个groupby 并使用nlargest(3) 来获取前n 个值。

然后我们可以创建一个有序列表来对您的最高值进行排序并创建一个分类列。

s = df.groupby(['job','source']).agg('count':sum).groupby(level=0)['count']\
.nlargest(3).reset_index(0,drop=True).to_frame()


# see which of your indices is higher and create a sorting list.

sorter = s.groupby(level=0)['count'].sum().sort_values(ascending=False).index
#Index(['sales', 'market'], dtype='object', name='job')

s['sort'] = pd.Categorical(s.index.get_level_values(0),sorter)


df2 = s.sort_values('sort').drop('sort',axis=1)

print(df2)

               count
job    source       
sales  E           7
       C           6
       B           4
market A           5
       D           4
       B           3

【讨论】:

非常感谢您的帮助,它确实获得了我想要的确切结果。

以上是关于如何对最终输出的数据进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 csv 文件中的数据排序为标准化输出,同时读取标题以对数据进行排序

如何在 Hive 中对文件进行重复数据删除并保持原始排序顺序?

批处理:如何按扩展对输出进行排序

对大文件排序

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

如何就地对文件进行排序