我有一个包含多个列的数据框,我正在尝试根据列对其进行分组,并根据另一列对其进行排序。 如果我像这样应用groupby():
data.groupby(columnA)
它没有吐出任何错误,但如果我尝试按照这样排序:
data.groupby(columnA).sort(coulmnB)
它给了我
TypeError: 'bool' object is not callable
我在任何列中都没有任何bool对象,并且完全不清楚为什么会出现此错误。 我该如何解决这个问题?如果我完全做错了,那么分组的另一种方式是什么,并根据两个不同的列对DataFrame进行排序? 提前谢谢。
答案 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_values
,see 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'方法