使用multiindex在pandas pivot_table上创建一个新列

时间:2016-09-19 20:03:32

标签: pandas pivot-table multiple-columns concat multi-index

这似乎很简单,我无法相信我在拉我的头发。 我有一个像这样的pivot_table

Name      income          expenses
         2015  2016       2015  2016
Joe Doe     2     4          5     7
Jane Doe    2     4          5     7
Doe Joe     2     4          5     7
Doe Jane    2     4          5     7

我只想添加一个计算列profit_loss =(收入 - 费用) 我认为它会是这样的:

 df['profit_loss'] = df['income'] - df['expenses]

我只会收到错误。

无需为创建此pivot_table的基表编写大量代码或准备工作,是否有更简单的方法来处理pandas pivot_table上的MultiIndexes

2 个答案:

答案 0 :(得分:0)

您可以先使用sort_index,因为错误:

  

KeyError:'MultiIndex Slicing要求索引完全是lexsorted tuple len(2),lexsort depth(0)'

然后使用slicers并将concat a提交给原始df

df.sort_index(axis=1, inplace=True)

idx = pd.IndexSlice
a  = df.loc[:,idx['income',:]] - df.loc[:,idx['expenses',:]].values
#rename column name
a = a.rename(columns={'income':'profit_loss'})
print (a)
         profit_loss     
                2015 2016
Joe Doe           -3   -3
Jane Doe          -3   -3
Doe Joe           -3   -3
Doe Jane          -3   -3

df1 = pd.concat([df,a], axis=1)
print (df1)
         expenses      income      profit_loss     
             2015 2016   2015 2016        2015 2016
Joe Doe         5    7      2    4          -3   -3
Jane Doe        5    7      2    4          -3   -3
Doe Joe         5    7      2    4          -3   -3
Doe Jane        5    7      2    4          -3   -3

答案 1 :(得分:0)

无需排序,您无需将其分配给多索引中的新列,如下所示:

df['profit_loss','2015'] = df['income','2015'] - df['expenses','2015']
df['profit_loss','2016'] = df['income','2016'] - df['expenses','2016']

虽然这可能会使很多年变得混乱,但是我想如果您需要重复执行此操作,那么您可以创建一个函数并遍历这些年。