Pandas 如何基于聚合对组进行排序
假设我有一个数据帧df,并在上面使用了groupby。如何对这些组进行排序?我想先让B列中位数最高的组,最后是中位数最低的组。 我知道如何对中值进行排序:Pandas 如何基于聚合对组进行排序,pandas,pandas-groupby,Pandas,Pandas Groupby,假设我有一个数据帧df,并在上面使用了groupby。如何对这些组进行排序?我想先让B列中位数最高的组,最后是中位数最低的组。 我知道如何对中值进行排序: df.groupby(by='A')['B'].median().sort_values(ascending=False) 但是我实际上如何对组进行排序(而不是中位数)?您可以使用排序值的结果中的索引对组进行索引: In [118]: df = pd.DataFrame(np.random.randn(5,3), columns=list(
df.groupby(by='A')['B'].median().sort_values(ascending=False)
但是我实际上如何对组进行排序(而不是中位数)?您可以使用
排序值的结果中的索引对组进行索引:
In [118]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df['group'] = list('aabcc')
df
Out[118]:
a b c group
0 3.260645 -0.636861 0.183312 a
1 -0.409939 1.915902 -2.426166 a
2 -0.522152 1.621288 0.225874 b
3 0.576484 0.499148 -1.037899 c
4 0.626081 0.040262 -1.679669 c
In [128]:
gp = df.groupby('group')['a'].median()
gp
Out[128]:
group
a 1.425353
b -0.522152
c 0.601282
Name: a, dtype: float64
In [134]:
order = gp.sort_values(ascending=False)
order
Out[134]:
group
a 1.425353
c 0.601282
b -0.522152
Name: a, dtype: float64
In [135]:
gp[order.index]
Out[135]:
group
a 1.425353
c 0.601282
b -0.522152
Name: a, dtype: float64
编辑
如果要使用基于中值的排序顺序,可以使用transform
将中值列添加回原始df,然后对原始df进行排序:
In [7]:
df['median'] = df.groupby('group')['a'].transform('median')
df
Out[7]:
a b c group median
0 3.260645 -0.636861 0.183312 a 1.425353
1 -0.409939 1.915902 -2.426166 a 1.425353
2 -0.522152 1.621288 0.225874 b -0.522152
3 0.576484 0.499148 -1.037899 c 0.601282
4 0.626081 0.040262 -1.679669 c 0.601282
In [9]:
df.loc[df['median'].sort_values(ascending=False).index]
Out[9]:
a b c group median
1 -0.409939 1.915902 -2.426166 a 1.425353
0 3.260645 -0.636861 0.183312 a 1.425353
4 0.626081 0.040262 -1.679669 c 0.601282
3 0.576484 0.499148 -1.037899 c 0.601282
2 -0.522152 1.621288 0.225874 b -0.522152
我的理解是,您正在寻找按中间值排序的组
如果是这种情况,您可以使用:
df.groupby(by='A')['B'].median().sort_values(ascending=False).index
谢谢,这是正确的方向。然而,它并没有回答我的完整问题,因为最后,(out[135])仍然是中位数被分类,而不是组。也就是说,我想做一些类似于df.groupby('group')[order.index]
的事情来对组(及其所有值)进行排序,但这对我不起作用('Columns not found')。有什么建议吗?@brina Suggestion:添加一个带有组中位数的列,按其排序df
,然后使用sort=False
再次分组。默认情况下,组是alpha排序的。您可以选择不这样排序df.groupby('A',sort=False)
,这样性能会稍微好一点。而且没有办法对组进行不同的排序吗?我在这里准备一个箱线图,所以我想每个箱子有一组,但我仍然想改变箱子在x轴上的位置(确切地说,我想按B列中给出的“重要性”对它们进行排序),这意味着你是按值排序的,如下面的@EdChum所示。你也读过我对他的演示的评论吗?我想像他那样对各组进行排序,但我仍然希望每个组中都包含所有值,而不仅仅是中位数。我不知道这是怎么可能的。谢谢你回答这个问题,但考虑到我最初的问题已经两年多了,我自己也不记得细节了(也不记得我现在在哪里有可以用来尝试这个的代码)…我明白了。我给出回复的原因是为其他面临类似问题的人提供一个解决方案——比如我,几天前!