在Pandas中按组大小对分组数据进行排序

33

我的数据集中有两列,col1和col2。我想按照col1分组,然后按每个组的大小排序。也就是说,我想按照组大小的升序显示分组。

我已经编写了分组和显示数据的代码,如下所示:

grouped_data = df.groupby('col1')
"""code for sorting comes here"""
for name,group in grouped_data:
          print (name)
          print (group)

在显示数据之前,我需要按照组大小对其进行排序,但我无法做到。

3个回答

67

对于 Pandas 0.17 及以上版本,请使用 sort_values

df.groupby('col1').size().sort_values(ascending=False)

对于0.17版本之前的版本,您可以使用size().order()

df.groupby('col1').size().order(ascending=False)

我正在执行 df.groupby('A')['B'].mean()。有没有办法按大小排序获取组的平均值?谢谢。 - Neo
@Neo 你的意思是:df.groupby('A')['B'].mean().sort_values(ascending=False) 吗? - Victor Yan
2
我认为这将对mean()值进行排序。我想先按组大小排序,然后找到每个组的平均值。 - Neo
1
@Neo 我认为这个可以:df.groupby("A")['B'].agg(['size', 'mean']).sort_values(by='size', ascending=False) - Victor Yan

16
你可以使用Python的 sorted 函数:
In [11]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], index=['a', 'b', 'c'], columns=['A', 'B'])

In [12]: g = df.groupby('A')

In [13]: sorted(g,  # iterates pairs of (key, corresponding subDataFrame)
                key=lambda x: len(x[1]),  # sort by number of rows (len of subDataFrame)
                reverse=True)  # reverse the sort i.e. largest first
Out[13]: 
[(1,    A  B
     a  1  2
     b  1  4),
 (5,    A  B
     c  5  6)]
注意:作为迭代器g,迭代键和相应子框架的成对数据。
In [14]: list(g)  # happens to be the same as the above...
Out[14]:
[(1,    A  B
     a  1  2
     b  1  4,
 (5,    A  B
     c  5  6)]

sorted函数运行良好,但它返回一个列表。列表的每个元素都是一个pandas数据帧。因此,我尝试使用以下代码访问列:sorted_data = sorted (...) print sorted_data[0]['col2']但这并不起作用。如何在排序后的列表中访问数据帧的每一列? - krackoder
1
这是一个元组列表,因此您可以使用以下方式进行迭代:for name, group in sorted(..),然后列为group['col2']。或者您可以使用sorted_data[0][1]['col2']... - Andy Hayden
哦,是的。我错过了它是一个元组列表的事实。谢谢。 - krackoder

0
df = pandas.DataFrame([[5, 5], [9, 7], [1, 8], [1, 7], [7, 8],
                       [9, 5], [5, 6], [1, 2], [1, 4], [5, 6]],
                      columns=['A', 'B'])

A   B
0   5   5
1   9   7
2   1   8
3   1   7
4   7   8
5   9   5
6   5   6
7   1   2
8   1   4
9   5   6
group = df.groupby('A')

count = group.size()

count  
A  

1   4
5   3
7   1
9   2
dtype: int64
grp_len = count[count.index.isin(count.nlargest(2).index)]

grp_len   
A  

1   4
5   3
数据类型:int64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接