如何使用pandas在数据透视表中添加计算列?

时间:2015-03-25 06:26:31

标签: pandas pivot-table calculated-columns

我正在使用熊猫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 个答案:

答案 0 :(得分:1)

这是因为您在“数据透视表”数据框中有一个层次索引(即MultiIndex)作为列。 如果您打印出df1['D'] * 2的结果,您会注意到有两列:

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

中找到有关如何处理MultiIndex的更多信息