这必须是一个基本问题,但很难发现。假设我使用了Pandas groupby
和agg
方法来计算某些列:
df.groupby(['col1']).agg(['count'])
然后让我们说我想按结果计数排序:
df.groupby(['col1']).agg(['count']).sort_values('count')
这给了我一个错误:
KeyError:'count'
因此,似乎结果列的计数实际上不是列,或者是没有键的列。
如果是这种情况,我将如何对计数结果数据框进行排序?
答案 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')])