2017-05-11 2 views
1

Hier habe ich ein Datenrahmen wie unten:Wie man Groupby Multi-Index als neue Spalten in Pandas konvertieren?

enter image description here:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame() 
>>> df["user_id"] = [1,1,1,2,2,3,4,4,4,4] 
>>> df["cate"] = ["a","b","c","b","c","a","a","b","c","d"] 
>>> df["prob"] = [np.random.rand() for _ in range(len(df["user_id"]))] 

enter image description here

ich die pro jedes cate als neue Spalten des Benutzers (user_id), wie dies zu konvertierende

Die einzige Lösung, um dieses Problem zu lösen, ist die Verwendung for loop, wenn ich Zehntausende Benutzer habe, ist es sehr ve langsam!

user_ids = list(set(df["user_id"])) 
cates = list(set(df["cate"])) 

user_probs = pd.DataFrame() 
for uid in user_ids: 
    d = pd.DataFrame({'user_id': [uid]}) 
    for c in cates: 
     ratio = df[(df["user_id"] == uid) & (df["cate"] == c)]["prob"] 
     ratio = 0 if len(ratio)==0 else float(ratio) 
     d["cate_"+c+"_prob"] = ratio 

    user_probs = pd.concat([user_probs, d]) 

Also, Pandas haben eingebaute Methode, um dieses Problem zu lösen? Vielen Dank!

Antwort

2

Pivot würde hier sehr gut arbeiten

df.pivot('user_id', 'cate', 'prob').reset_index().fillna(0) 

Sie erhalten

cate user_id a   b   c   d 
0  1  0.853583 0.161935 0.388652 0.000000 
1  2  0.000000 0.554185 0.177939 0.000000 
2  3  0.700654 0.000000 0.000000 0.000000 
3  4  0.781307 0.634584 0.861808 0.130701 

Ein anderer Weg set_index mit

df.set_index(['user_id', 'cate']).prob.unstack(fill_value = 0).reset_index() 

Sie erhalten das gleiche Ergebnis

+0

Awesome! Vielen Dank! – SunnyMarkLiu

Verwandte Themen