2016-10-25 178 views
9

問題

有一些類似於兩個問題,但它們不是同一個問題:herehere。他們都稱GroupBy的方法,如count()aggregate(),我知道這返回DataFrame。我問的是如何將GroupBypandas.core.groupby.DataFrameGroupBy類)對象本身轉換爲DataFrame。我會在下面說明。Python的大熊貓轉換的GroupBy對象到數據幀

構造一個例子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

哇,!!!! Riiiiiight !!!!!好的,當Stack Overflow允許我在9分鐘內接受這個答案。謝謝。 – Ray

+0

當我嘗試使用這個答案時,我得到一個'AttributeError'。 「無法訪問'DataFrameGroupBy'對象的可調用屬性'set_index',嘗試使用'apply'方法」 – Nate

+1

@Nate - 看起來'data'不是'DataFrame',而是groupby的輸出 - 所以需要'g = df.groupby ('col')'然後'g.apply(lambda x:x ['col1']。set_index())' – jezrael