2017-08-11 87 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