如何使用 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 的更多信息
我正在使用 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 的更多信息