如何调整Pandas GroupBy后的DataFrame输出顺序与格式?
解决Pandas分组后索引转列并调整排序的问题
你遇到的其实是分组后多级索引转普通列的问题,而且还希望结果按month和指定的day顺序排列对吧?很简单,用reset_index()加上排序就能搞定!
首先,先看最基础的解决方法:你分组后得到的结果里,day和month是作为**多级索引(MultiIndex)**存在的,不是普通列。只需要在分组代码后面加上.reset_index(),就能把这两个索引变回DataFrame的列:
import pandas as pd d = {'day': ["t", "m", "m", "w", "t", "m","w"], 'month': ["01", "01", "01", "01", "02","02","02"], 'count': [1, 1, 1, 1,1,1,1]} df = pd.DataFrame(data=d) # 分组后重置索引,把day和month转为列 grouped_df = df.groupby(by=['day','month']).count().reset_index() print(grouped_df)
这时候输出会是:
day month count 0 m 01 2 1 m 02 1 2 t 01 1 3 t 02 1 4 w 01 1 5 w 02 1
不过你想要的是先展示month=01的所有day,再展示month=02的,而且day顺序是m→t→w。这时候只需要对结果按month和day排序就行,因为m、t、w刚好是字母顺序,直接排序就符合你的要求:
# 重置索引后按month和day排序,并且去掉临时的排序索引 final_df = grouped_df.sort_values(by=['month', 'day']).reset_index(drop=True) print(final_df)
这样就能得到你想要的目标输出:
day month count 0 m 01 2 1 t 01 1 2 w 01 1 3 m 02 1 4 t 02 1 5 w 02 1
如果你的day顺序不是字母顺序(比如想要t→m→w),还可以通过分类类型来指定自定义排序:
# 指定day的自定义顺序 day_order = ['m', 't', 'w'] # 将day列转为分类类型,指定顺序 grouped_df['day'] = pd.Categorical(grouped_df['day'], categories=day_order, ordered=True) # 再排序 final_df = grouped_df.sort_values(by=['month', 'day']).reset_index(drop=True)
这样不管day的字母顺序如何,都能按照你指定的顺序排列啦!
内容的提问来源于stack exchange,提问作者user9399405
相关产品推荐
相关产品推荐

