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

How do I use pandas to add a calculated column in a pivot table?

我正在使用 pandas 0.16.0 & numpy 1.9.2 我执行了以下操作以在数据透视 table

中添加一个计算字段(列)

如下设置dataframe,

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

这是因为您的 'pivot table' 数据框中有一个 层次索引 (即 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 的更多信息