2016-06-13 3 views
3

У меня есть блок данных с несколькими столбцами, и я пытаюсь сгруппировать его по столбцу и сортировать его по другому столбцу. Если я применяю GroupBy(), как это:Объект pandas 'bool нельзя назвать'

data.groupby(columnA) 

не выплюнуть ошибки, но если я пытаюсь уладить это так:

data.groupby(columnA).sort(coulmnB) 

это дает мне

TypeError: 'bool' object is not callable 

У меня нет каких-либо объектов bool в любом из столбцов, и совершенно не знаю, почему эта ошибка происходит. Как я могу решить эту проблему? Если я полностью ошибаюсь, что еще один способ группировать и сортировать DataFrame в соответствии с двумя разными столбцами? Спасибо заранее.

ответ

1

Я думаю, что вам нужно GroupBy.applysort_values:

EDIT: Но лучше использует 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 является DEPRECATED.

, но если использовать sort_values получить сообщение об ошибке:

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

AttributeError: Cannot access callable attribute 'sort_values' of 'DataFrameGroupBy' objects, try using the 'apply' method

3

Так как вы хотите отсортировать по 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, поэтому не может быть c alled:

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 

Примечание: Это поведение/упорядочивание не гарантируется, это просто означает, что панды не будет выходить из ее способ заказать группу с ключом ... например для некоторых типов индексов он может сортировать:

In [34]: df.groupby("B", sort=False).sum() 
Out[34]: 
    A 
B 
1 b 
2 a 
Смежные вопросы