Python 如何在Pandas中对透视表进行排序
代码如下:Python 如何在Pandas中对透视表进行排序,python,pandas,Python,Pandas,代码如下: test = pd.DataFrame({'country':['us','ca','ru','cn','ru','cn','us','ca','ru','cn','us','ca','ru','cn','us','ca'], 'month':[5,6,7,5,6,7,5,5,6,7,5,6,6,5,5,6], 'id':[x for x in range(16)]}) p = test.pivot_table(index=['month', 'country'], aggfunc=
test = pd.DataFrame({'country':['us','ca','ru','cn','ru','cn','us','ca','ru','cn','us','ca','ru','cn','us','ca'], 'month':[5,6,7,5,6,7,5,5,6,7,5,6,6,5,5,6], 'id':[x for x in range(16)]})
p = test.pivot_table(index=['month', 'country'], aggfunc='count')[['id']]
输出如下所示:
我想按id
列对表进行排序,以便最大的数字出现在顶部,如:
id
month country
us 4
5 cn 2
ca 1
您需要,并且:
因为此解决方案不起作用:(
选项1
这将根据索引中的
month
级别定义的组内的id
进行排序
p.groupby(
level='month', group_keys=False
).apply(pd.DataFrame.sort_values, by='id', ascending=False)
id
month country
5 us 4
cn 2
ca 1
6 ca 3
ru 3
7 cn 2
ru 1
选项2
这首先按照
id
对整个数据帧进行排序,然后再按照索引中的month
级别进行排序。然而,出于不言自明的原因,我不得不使用sort\u remaining=False
,并且kind='mergesort'
因为mergesort
是一种稳定的排序,不会扰乱组中预先存在的顺序由“月”级别定义
p.sort_values('id', ascending=False) \
.sort_index(level='month', sort_remaining=False, kind='mergesort')
id
month country
5 us 4
cn 2
ca 1
6 ca 3
ru 3
7 cn 2
ru 1
选项3
这使用了numpy的
lexsort
…这是可行的,但我不喜欢它,因为它依赖于id
是数字,并且我能够在它前面放一个负数以获得降序。/shugh
p.iloc[np.lexsort([-p.id.values, p.index.get_level_values('month')])]
id
month country
5 us 4
cn 2
ca 1
6 ca 3
ru 3
7 cn 2
ru 1
@斯科特伯顿-这个问题真的很难回答,我试图在github中找到一些关于它的问题,但没有成功(
p.sort_values('id', ascending=False) \
.sort_index(level='month', sort_remaining=False, kind='mergesort')
id
month country
5 us 4
cn 2
ca 1
6 ca 3
ru 3
7 cn 2
ru 1
p.iloc[np.lexsort([-p.id.values, p.index.get_level_values('month')])]
id
month country
5 us 4
cn 2
ca 1
6 ca 3
ru 3
7 cn 2
ru 1