2017-08-10 117 views
0

我的数据帧目前的样子:枢轴行

ID    FIELD  VALUE 
12463634   TEST   22.2 
12463634  E_REASON   010 
12463634  IN_SCOPE   Y 
12463635   TEST   99.5 
12463635  E_REASON   020 
12463635  IN_SCOPE   N 

我想我的数据框的样子:

ID   TEST  E_REASON  IN_SCOPE 
12463634  22.2   010   Y 
12463635  99.5   020   N 

我曾尝试运行此代码:

df.pivot_table(index = "ID", columns = "FIELD", values = "VALUE") 

但是,我看到此错误:

DataError: No numeric types to aggregate 

请指教。谢谢!

+0

我想可能你想要的是'pivot'而不是'pivot_table'。 – Ajean

+0

只有他们做出非唯一索引。我只是试了一下,数据透视工作正常。 – Ajean

回答

1

使用pivotunstack

df = df.pivot(index = "ID", columns = "FIELD", values = "VALUE") 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  Y 22.2 
12463635  020  N 99.5 

df = df.set_index(['ID', 'FIELD'])['VALUE'].unstack() 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  Y 22.2 
12463635  020  N 99.5 

如果重复需要pivot_table一些聚合函数 - sum','join

print (df) 
     ID  FIELD VALUE 
0 12463634  TEST 22.2 
1 12463634 E_REASON 010 
2 12463634 IN_SCOPE  Y<-same ID and FIELED 
3 12463634 IN_SCOPE Y1<-same ID and FIELED 
4 12463635  TEST 99.5 
5 12463635 E_REASON 020 
6 12463635 IN_SCOPE  N 


df = df.pivot_table(index = "ID", columns = "FIELD", values = "VALUE", aggfunc='sum') 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  YY1 22.2 
12463635  020  N 99.5 

或者:

df = df.pivot_table(index = "ID", columns = "FIELD", values = "VALUE", aggfunc=','.join) 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  Y,Y1 22.2 
12463635  020  N 99.5 
+1

枢轴工作得很好 - 谢谢! – kbball

0

另一种选择是像做:

df.groupby(['ID', 'FIELD']).sum().unstack() 

这样你就不会失去标签'VALUES'

说明

可以groupbysum(),这将给你

In [31]: df.groupby(['ID', 'FIELD']).sum() 
Out[31]: 
        VALUE 
ID  FIELD 
12463634 E_REASON 010 
     IN_SCOPE  Y 
     TEST  22.2 
12463635 E_REASON 020 
     IN_SCOPE  N 
     TEST  99.5 

然后unstack将最后索引的行移动到列