2016-10-25 6 views
9

Вопрос

Есть два вопроса, которые похожи, но они не тот же вопрос: here и here. Они оба называют метод GroupBy, например count() или aggregate(), который, как мне известно, возвращает DataFrame. Я спрашиваю, как преобразовать объект GroupBy (класс pandas.core.groupby.DataFrameGroupBy) в DataFrame. Я проиллюстрирую ниже.Python Панды преобразовать объект GroupBy в DataFrame

Пример

Построить пример DataFrame следующим образом.

data_list = [] 
for name in ["sasha", "asa"]: 
    for take in ["one", "two"]: 
     row = {"name": name, "take": take, "score": numpy.random.rand(), "ping": numpy.random.randint(10, 100)} 
     data_list.append(row) 
data = pandas.DataFrame(data_list) 

Приведенный выше DataFrame должен выглядеть следующим образом (с разными номерами, очевидно).

name ping  score take 
0 sasha 72 0.923263 one 
1 sasha 14 0.724720 two 
2 asa 76 0.774320 one 
3 asa 71 0.128721 two 

То, что я хочу сделать, это группы по столбцам «имя» и «взять» (в таком порядке), так что я могу получить DataFrame индексированный по мультииндексу, построенный из «имени» столбцов и «взять», как показано ниже.

   score ping 
name take   
sasha one 0.923263 72 
     two 0.724720 14 
    asa one 0.774320 76 
     two 0.128721 71 

Как это достичь? Если я делаю grouped = data.groupby(["name", "take"]), то grouped является экземпляром pandas.core.groupby.DataFrameGroupBy. Как преобразовать grouped в экземпляр DataFrame?

ответ

7

Вам нужно set_index:

data = data.set_index(['name','take']) 
print (data) 
      ping  score 
name take     
sasha one  46 0.509177 
     two  77 0.828984 
asa one  51 0.637451 
     two  51 0.658616 
+0

Oooooh !!!! Riiiiiight !!!!! OK Я приму этот ответ за 9 минут, когда Stack Overflow позволяет мне. Спасибо. – Ray

+0

Когда я пытаюсь использовать этот ответ, я получаю атрибут AttributeError. «Невозможно получить доступ к вызываемому атрибуту« set_index »объектов« DataFrameGroupBy », попробуйте использовать метод« apply ». – Nate

+1

@Nate - Кажется, что' data' не 'DataFrame', а вывод groupby - так нужно' g = df.groupby ('col') ', а затем' g.apply (lambda x: x ['col1']. set_index()) ' – jezrael

Смежные вопросы