Erste Spalte ist index
, daher ist die Änderung index='UserID'
zu index=df.index
erforderlich.
Auch Aggregatfunktion ist GroupBy.size
df = pd.pivot_table(df, index=df.index, columns=df['ID'], aggfunc='size', fill_value=0)
print (df)
ID a1 a2 a3
UserID
1 1 1 0
2 1 0 1
Lösung mit crosstab
:
df = pd.crosstab(df.index,df['ID'])
print (df)
ID a1 a2 a3
row_0
1 1 1 0
2 1 0 1
Or (pandas 0.20.1+) Lösung - groupby
von index
und Spalte zusammen, aggregieren size
und umformen von unstack
:
df = df.groupby(['UserID','ID']).size().unstack(fill_value=0)
print (df)
ID a1 a2 a3
UserID
1 1 1 0
2 1 0 1
Pandas 0.20.1 Lösung unten - konvertieren Index Spalte von reset_index
:
df = df.reset_index().groupby(['UserID','ID']).size().unstack(fill_value=0)
print (df)
ID a1 a2 a3
UserID
1 1 1 0
2 1 0 1
EDIT:
Es scheint Index auch von Indexnamen ausgewählt werden kann (nicht sicher, ob es unten 0.20 funktioniert. 1):
df = pd.pivot_table(df, index='UserID', columns='ID', aggfunc='size', fill_value=0)
print (df)
ID a1 a2 a3
UserID
1 1 1 0
2 1 0 1
Wow so viele Möglichkeiten. – Dark