2016-08-03 10 views
3

Ich habe folgenden Datenrahmen:Pivot eine Gruppe durch Objekt in Pandas?

df = pd.DataFrame([ 
     [123, 'abc', '121'], 
     [124, 'abc', '121'], 
     [456, 'def', '121'], 
     [123, 'abc', '122'], 
     [123, 'abc', '122'], 
     [456, 'def', '145'], 
     [456, 'def', '145'], 
     [456, 'def', '146'], 
    ], columns=['userid', 'name', 'dt']) 

Ich habe es nach dem Datum gruppiert: df2 = df.groupby('dt').apply(lambda df: df.reset_index(drop=True))

nun die Datenrahmen wie folgt aussehen: Jetzt enter image description here

, ich will verschwenken die oben genannten, so dass sie in diesem Format sind: userid name_1, name_2, ..., name_k für jede Gruppe, so dass das Ende df in etwa so aussieht:

userid name 
123  abc 
124  abc 
456  def 
123  abc, abc 

Antwort

2

können Sie cumcount mit pivot_table verwenden, wobei Parameter-Index Verwendung Spalten userid und dt, so sieht es aus wie df2 erstellen ist nicht notwendig:

df['cols'] = 'name_' + (df.groupby(['userid','dt']).cumcount() + 1).astype(str) 

print (df.pivot_table(index=['userid', 'dt'],columns='cols', values='name', aggfunc=''.join)) 
cols  name_1 name_2 
userid dt    
123 121 abc None 
     122 abc abc 
124 121 abc None 
456 121 def None 
     145 def def 
     146 def None 
+0

YUC <- richtig verstanden Sie. Vielen Dank: D – Dawny33

2

prüfen groupby und apply aus. Ihre jeweiligen Dokumente sind here und here. Sie können unstack (docs) die zusätzliche Ebene des MultiIndex erstellen.

df = df.set_index(['userid', 'dt'])['name'] 
df = df.groupby(level=[0,1]).apply(
    lambda st: pd.Series(st.values, index=['name_%i'%i for i in range(st.shape[0])]) 
).unstack(level=-1) 
print(df) 

Ausgänge

  name_0 name_1 
userid dt    
123 121 abc None 
     122 abc abc 
124 121 abc None 
456 121 def None 
     145 def def 
     146 def None