2016-10-25 12 views
9

Pytanie

Istnieją dwa pytania, które wyglądają podobnie, ale nie są one takie same pytanie: here i here. Obaj nazywają metodę GroupBy, taką jak count() lub aggregate(), która, jak wiem, zwraca wartość DataFrame. Pytam tylko, jak przekonwertować obiekt GroupBy (klasa) sam na DataFrame. Zilustruję poniżej.Python Pandy konwertować obiekt GroupBy do DataFrame

Przykład

Konstrukt przykład DataFrame następująco.

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) 

Powyższy DataFrame powinien wyglądać następująco (z różnymi liczbami oczywiście).

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 

Co chcę zrobić, to grupy przez kolumny „Nazwa” i „wziąć” (w tej kolejności), tak, że mogę dostać DataFrame indeksowane przez multiindex zbudowanego z kolumn „nazwa” i "wziąć", jak poniżej.

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

Jak to osiągnąć? Jeśli wykonam grouped = data.groupby(["name", "take"]), to grouped jest instancją pandas.core.groupby.DataFrameGroupBy. Jak przekonwertować grouped do instancji DataFrame?

Odpowiedz

7

Trzeba 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. Przyjmuję tę odpowiedź w 9 minut, kiedy pozwala mi Stack Overflow. Dziękuję Ci. – Ray

+0

Kiedy próbuję użyć tej odpowiedzi, otrzymuję "AttributeError". "Nie można uzyskać dostępu do atrybutu" set_index "obiektu" DataFrameGroupBy ", spróbuj użyć metody" apply "" – Nate

+1

@Nate - Wygląda na to, że 'data' nie jest' DataFrame', ale wynik groupby - więc potrzebujesz 'g = df.groupby ('col') ', a następnie' g.apply (lambda x: x ['col1'] .set_index()) ' – jezrael