2017-08-11 89 views
3

我想這個數據轉動:樞轉數據大熊貓

  ID 
UserID 
1  a1 
1  a2 
2  a1 
2  a3 

到像一個數據幀:

UserID a1 a2 a3 
1  1 1 0 
2  1 0 1 

我試着做以下df = pd.pivot_table(df, index='UserID', columns='ID',但它給了我一個DataError: No numeric types to aggregate錯誤。我能做什麼?

回答

6

第一列是index,所以需要更改index='UserID'index=df.index

另外聚合函數是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 

crosstab

df = pd.crosstab(df.index,df['ID']) 
print (df) 
ID  a1 a2 a3 
row_0    
1  1 1 0 
2  1 0 1 

或(pandas 0.20.1+)溶液 - groupby通過index和柱一起,骨料size和重塑由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 

大熊貓婁0.20.1解決方案 - 通過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 

編輯:

看來指數可以通過索引名,可以選擇太(不知道它的工作原理波紋管0.20。 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 
+1

哇如此多的選擇。 – Dark