如何对最终输出的数据进行排序?
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_values
和job
再次提到的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 中对文件进行重复数据删除并保持原始排序顺序?