Pandas的bool对象不可调用'

时间:2016-06-13 03:28:37

标签: python sorting pandas dataframe

我有一个包含多个列的数据框,我正在尝试根据列对其进行分组,并根据另一列对其进行排序。 如果我像这样应用groupby():

data.groupby(columnA)

它没有吐出任何错误,但如果我尝试按照这样排序:

data.groupby(columnA).sort(coulmnB)

它给了我

TypeError: 'bool' object is not callable

我在任何列中都没有任何bool对象,并且完全不清楚为什么会出现此错误。 我该如何解决这个问题?如果我完全做错了,那么分组的另一种方式是什么,并根据两个不同的列对DataFrame进行排序? 提前谢谢。

2 个答案:

答案 0 :(得分:4)

由于您希望先按columnA排序,然后再按columnB排序,因此您只能使用sort_values执行此操作:

# using jezrael's example
In [11]: data.sort_values(["columnA", "columnB"])
Out[11]:
   columnA  columnB  columnC
4        1        2        8
0        1        7        7
5        2        4        0
1        2        5        8
3        3        1        1
2        3        6        9

In [12]: data.sort_values(["columnA", "columnB"], ascending=[True, False])
Out[12]:
   columnA  columnB  columnC
0        1        7        7
4        1        2        8
1        2        5        8
5        2        4        0
2        3        6        9
3        3        1        1

注意:sort是groupby的(boolean)属性,这就是无法调用它的原因:

In [21]: data.groupby("columnA").sort
Out[21]: True

In [22]: data.groupby("columnA", sort=False).sort
Out[22]: False

In [23]: True()
TypeError: 'bool' object is not callable

您可以通过以下示例查看内部功能:

In [31]: df = pd.DataFrame([["b", 1], ["a", 2]], columns=["A", "B"])

In [32]: df.groupby("A").sum()
Out[32]:
   B
A
a  2
b  1

In [33]: df.groupby("A", sort=False).sum()
Out[33]:
   B
A
b  1
a  2

注意:这种行为/顺序无法保证,只是意味着pandas不会用尽顺序来订购groupby键......例如对于某些索引类型,它可以排序:

In [34]: df.groupby("B", sort=False).sum()
Out[34]:
   A
B
1  b
2  a

答案 1 :(得分:3)

我认为您需要GroupBy.apply sort_values

编辑:但最好只使用sort_valuessee Andy's answer

import pandas as pd

data = pd.DataFrame({'columnA':[1,2,3,3,1,2],
                     'columnB':[7,5,6,1,2,4],
                     'columnC':[7,8,9,1,8,0]})

print (data)
   columnA  columnB  columnC
0        1        7        7
1        2        5        8
2        3        6        9
3        3        1        1
4        1        2        8
5        2        4        0

print (data.groupby('colA').apply(lambda x:x.sort_values('colB')).reset_index(drop=True))
   colA  colB  colC
0     1     2     8
1     1     7     7
2     2     4     0
3     2     5     8
4     3     1     1
5     3     6     9

print (data.groupby('colA').apply(lambda x:x.sort_values('colC')).reset_index(drop=True))
   colA  colB  colC
0     1     7     7
1     1     2     8
2     2     4     0
3     2     5     8
4     3     1     1
5     3     6     9

sort 已弃用

但是如果使用sort_values会收到错误:

print (data.groupby('colA').sort_values('colB'))
  

AttributeError:无法访问'DataFrameGroupBy'对象的可调用属性'sort_values',请尝试使用'apply'方法