2015-03-25 88 views
0

我用熊猫0.16.0 & numpy的1.9.2 我做了以下在数据透视表如何使用熊猫在数据透视表中添加计算列?

设置数据框如下添加计算字段(列),

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6, 'B' : ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D' : np.random.randn(24), 'E' : np.random.randn(24), 'F' : [datetime.datetime(2013, i, 1) for i in range(1, 13)] + [datetime.datetime(2013, i, 15) for i in range(1, 13)]}) 

透视型数据帧,如下所示,

df1 = df.pivot_table(values=['D'],index=['A'],columns=['C'],aggfunc=np.sum,margins=False) 

尝试添加计算的字段如下,但我得到一个错误(见下文),

df1['D2'] = df1['D'] * 2 

错误,

ValueError: Wrong number of items passed 2, placement implies 1 

回答

1

这是因为你有一个分级索引(即MultiIndex)作为'数据透视表'数据框中的列。 如果你要打印出的df1['D'] * 2 reslults你会发现,你得到两列:

C  bar  foo 
A     
one -3.163 -10.478 
three -2.988 1.418 
two -2.218 3.405 

所以把它恢复到df1您需要提供两列将其分配到:

df1[[('D2','bar'), ('D2','foo')]] = df1['D'] * 2 

哪产率:

  D   D2   
C  bar foo bar  foo 
A         
one -1.581 -5.239 -3.163 -10.478 
three -1.494 0.709 -2.988 1.418 
two -1.109 1.703 -2.218 3.405 

的更一般的方法:

new_cols = pd.MultiIndex.from_product(('D2', df1.D.columns)) 
df1[new_cols] = df1.D * 2 

你可以找到关于如何在docs

+0

由于处理多指标的详细信息,这个工作!另外,如果我不知道不同的列值(foo,bar)会怎么样;我如何将此扩展为通用? – user1944674 2015-03-25 09:07:53

+0

为答案增加了一般化的方法。 – Primer 2015-03-25 09:27:40