我正在使用熊猫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
答案 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的更多信息