如何确保Pandas agg fn为count创建的列具有名称?

时间:2018-04-20 20:26:55

标签: python pandas

这必须是一个基本问题,但很难发现。假设我使用了Pandas groupbyagg方法来计算某些列:

df.groupby(['col1']).agg(['count'])

然后让我们说我想按结果计数排序:

df.groupby(['col1']).agg(['count']).sort_values('count')

这给了我一个错误:

  

KeyError:'count'

因此,似乎结果列的计数实际上不是列,或者是没有键的列。

如果是这种情况,我将如何对计数结果数据框进行排序?

3 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点,恕我直言,都需要另一个列名。 1)您将名称传递给aggfunc count,以便您可以在排序

中使用

2)您可以让count裸露并直接在排序值中使用列名

方法1

df.groupby(['col1']).agg([('CountName', 'count')]).sort_values(('col2', 'CountName'))

方法2

df.groupby(['col1']).agg('count').sort_values('col2')

答案 1 :(得分:0)

执行agg时,生成的DataFrame不会使用函数的名称作为列名。

请参阅https://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.DataFrameGroupBy.agg.html

您可以通过list(df.groupby(['col1']).agg(['count']))查看生成的DataFrame中列的名称,然后将所需的列名称 - tuple - 传递到sort_values

答案 2 :(得分:0)

那么近,那么近...

首先,让我们解释一下为什么查询不起作用,或者至少不能按您期望的方式起作用

df.groupby(['col1']).agg(['count'])

希望您的数据框df有一个名为col1的列,因为这将成为组名,然后您希望在每个组中进行计数。您的语法是正确的,取决于您还有多少其他列,将在每一列上调用count函数,并且您的输出将具有与除col1以外的列数一样多的列。输出列名称不仅是count,而且是您需要准备使用的MultiIndex。

>>> df = pd.DataFrame({'col1':[1,1,2,2,2]})
>>> df = pd.DataFrame({
    'col1':[1,1,2,2,2], 
    'col2':[1,1,2,2,2],
    'col3':[1,1,2,2,2]
})
>>> a = df.groupby(['col1']).agg(['count'])
>>> a.index
Int64Index([1, 2], dtype='int64', name=u'col1')
>>> a.columns
MultiIndex(levels=[[u'col2', u'col3'], [u'count']], labels=[[0, 1], [0, 0]])

从这里开始,如果要排序,则通过传递一个元组将特定的MultiIndex传递给sort_values函数,然后就可以了。

>>> a.sort_values(by=[('col2', 'count')])
      col2   col3
      count  count
col1    
1     2      2
2     3      3

最终的解决方案应该是:

df.groupby(['col1']).agg(['count']).sort_values([('col2', 'count')])