【问题标题】:python pandas sorting by grouppython pandas按组排序
【发布时间】:2016-11-22 16:18:52
【问题描述】:

我的 DataFrame 中的每一行都是餐厅的用户投票条目。数据看起来像

id   cuisine    
91   american   
3    american   
91   american   
233  cuban      
233  cuban      
2    cuban      

其中id 指的是餐厅。

我想得到类似下面的东西

american  91   100
          3    30
          12   10
cuban     233  80
          2    33
mexican   22   99
          8    98
          21   82

其中第二列是id,第三列是id 在DataFrame 中的行数。换句话说,按行数排序,但按美食分组。我试过了

g = df.groupby(['cuisine', 'id'])
c = g.size().sort_values(ascending=False)

但是菜式的顺序是混杂的。

【问题讨论】:

标签: python pandas group-by pivot-table


【解决方案1】:

group_by 之后使用value_counts,然后是sort_index

# ascending=[1, 0] says True for level[0], False for level[1]
df.groupby('cuisine').id.value_counts().sort_index(ascending=[1, 0])

cuisine   id 
american  91     2
          3      1
cuban     233    2
          2      1
Name: id, dtype: int64

【讨论】:

  • value_counts() 默认按降序排列。甚至最后的排序也可以保存!
【解决方案2】:

这就是你想要的吗?

In [2]: df
Out[2]:
    id   cuisine
0   91  american
1    3  american
2   91  american
3  233     cuban
4  233     cuban
5    2     cuban

In [3]: df.groupby(['cuisine', 'id']).size()
Out[3]:
cuisine   id
american  3      1
          91     2
cuban     2      1
          233    2
dtype: int64

或作为数据框:

In [10]: df.groupby(['cuisine', 'id']).size().reset_index(name='count').sort_values(['cuisine', 'count'], ascending=[1,0])
Out[10]:
    cuisine   id  count
1  american   91      2
0  american    3      1
3     cuban  233      2
2     cuban    2      1

【讨论】:

猜你喜欢
  • 2014-11-17
  • 2018-10-07
  • 2013-02-03
  • 2018-11-05
  • 2016-01-16
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2016-02-15
相关资源
最近更新 更多