python - Pandas Column Multiindex 相互减去列

标签 python pandas multi-index

Pandas 数据框:

构造函数:

c = pd.MultiIndex.from_product([['AAPL','AMZN'],['price','custom']])
i = pd.date_range(start='2017-01-01',end='2017-01-6')
df1 = pd.DataFrame(index=i,columns=c)

df1.loc[:,('AAPL','price')] = list(range(51,57))
df1.loc[:,('AMZN','price')] = list(range(101,107))
df1.loc[:,('AAPL','custom')] = list(range(1,7))
df1.loc[:,('AMZN','custom')] = list(range(17,23))
df1.index.set_names('Dates',inplace=True)
df1.sort_index(axis=1,level=0,inplace=True) # needed for pd.IndexSlice[]

df1

产生:(不知道如何格式化 Jupyter Notebook 的输出)

    AAPL    AMZN
    custom  price   custom  price
Dates               
2017-01-01  1   51  17  101
2017-01-02  2   52  18  102
2017-01-03  3   53  19  103
2017-01-04  4   54  20  104
2017-01-05  5   55  21  105
2017-01-06  6   56  22  106

问题: 如何在 MultiIndex 的第 2 级创建第 3 列,这是 pricecustom 之间的区别?这应该针对每个顶级列级别单独计算,即针对 AAPL 和 AMZN 分别计算。

尝试的解决方案:

我尝试以两种方式使用 pd.IndexSlice,两者都给我 NaN:

df1.loc[:,pd.IndexSlice[:,'price']].sub(df1.loc[:,pd.IndexSlice[:,'custom']])
df1.loc[:,pd.IndexSlice[:,'price']] - df1.loc[:,pd.IndexSlice[:,'custom']]

返回:

    AAPL    AMZN
    custom  price   custom  price
Dates               
2017-01-01  NaN NaN NaN NaN
2017-01-02  NaN NaN NaN NaN
2017-01-03  NaN NaN NaN NaN
2017-01-04  NaN NaN NaN NaN
2017-01-05  NaN NaN NaN NaN
2017-01-06  NaN NaN NaN NaN

如何添加具有差异的第三列?

谢谢。

最佳答案

您可能会考虑减去这些值:

df1.loc[:, pd.IndexSlice[:, 'price']] - df1.loc[:,pd.IndexSlice[:,'custom']].values

要加入它,你可以使用pd.concat:

In [221]: df2 = (df1.loc[:, pd.IndexSlice[:, 'price']] - df1.loc[:,pd.IndexSlice[:,'custom']].values)\
                            .rename(columns={'price' : 'new'})

In [222]: pd.concat([df1, df2], axis=1)
Out[222]: 
             AAPL         AMZN       AAPL AMZN
           custom price custom price  new  new
Dates                                         
2017-01-01      1    51     17   101   50   84
2017-01-02      2    52     18   102   50   84
2017-01-03      3    53     19   103   50   84
2017-01-04      4    54     20   104   50   84
2017-01-05      5    55     21   105   50   84
2017-01-06      6    56     22   106   50   84

关于python - Pandas Column Multiindex 相互减去列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45763067/

相关文章:

python - 具有多索引的 Groupby

python - 如何重新索引 Pandas Dataframe 的 MultiIndex 列?

python - io.UnsupportedOperation : not readable

python - 使用样本权重训练 xgboost (0.7) 分类器

python - 如何使用 Pandas 将不一致的时间戳舍入到五分钟间隔并填补空白?

python Pandas : How can I group by and assign an id to all the items in a group?

Python/Pandas - 查询多索引列

python - 您如何知道哪个 pyTZ 实际上会按预期执行?

Python:如何使用 IDLE 调试器在 mac 上设置断点?

python - 使用快速傅里叶变换分析音频