【问题标题】:Create a new column on a pandas pivot_table with multiindex使用多索引在 pandas pivot_table 上创建一个新列
【发布时间】:2017-01-27 14:47:31
【问题描述】:

这看起来很简单,我简直不敢相信我在扯我的头发。 我有一个像这样的数据透视表

姓名收入支出 2015 2016 2015 2016 乔·多伊 2 4 5 7 简·多伊 2 4 5 7 能源部乔 2 4 5 7 美国能源部简 2 4 5 7

我只是想添加一个计算列利润损失 =(收入 - 费用) 我以为会是这样的:

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

我只会得到错误。

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

【问题讨论】:

  • 您能否将post 输出为df.to_dict(),以便我们更轻松地构建您的多索引DF?

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


【解决方案1】:

你可以先用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

【讨论】:

  • 如果我的回答有帮助,别忘了accept。谢谢。
【解决方案2】:

无需排序,您就不能在多索引中分配一个新列吗,如下所示:

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

这可能会在很多年之后变得一团糟,但我想如果您需要重复执行此操作,您可以创建一个函数并循环这些年。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多