2016-03-03 83 views
0

这个问题似乎很基本,但我找不到任何答案。减去每个级别的相同列多指数

我有一个多指标数据框看起来像这样

  A     B  
    a  b  c  a  b  c 
    x y z x y z x y z x y z x y z x y z 
1 : : : 
2 : : 
3 : 
4 
5 
6 
7 

和所有我想是创建另一个数据框,显示X-Z和Y-Z。 我试过减分片,但它给我的NaN(尽管是相同的尺寸)

test.loc[:,idx[:,:,'x']].sub(test.loc[:,idx[:,:,'z']]) 

你知道一个把戏来执行这项任务?

回答

0

熊猫操作(如减法)总是根据行列索引来对齐NDFrame。由于df.loc[:,idx[:,:,'x']]df.loc[:,idx[:,:,'z']]具有不同的列索引,减法产生的NaN:

x = df.loc[:,idx[:,:,'x']] 
z = df.loc[:,idx[:,:,'z']] 
x.sub(z) 

#  A      B      
#  a  b  c  a  b  c  
#  x z x z x z x z x z x z 
# 0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
# 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
# 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
# 3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
# 4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
# 5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
# 6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 

为了使熊猫执行操作逐元素(忽略指数),通过使z一个NumPy的数组中删除的索引:

x = df.loc[:,idx[:,:,'x']] 
z = df.loc[:,idx[:,:,'z']].values 
x.sub(z) 
    A  B  
    a b c a b c 
    x x x x x x 
0 1 -1 -1 -1 -5 -1 
1 0 1 0 4 -2 1 
2 -5 -9 4 7 -5 -2 
3 -5 -2 -6 -6 0 0 
4 -3 -4 4 -5 -6 8 
5 1 4 -7 7 -4 8 
6 4 0 -2 1 3 -6 

例如,

import pandas as pd 
import numpy as np 
np.random.seed(2016) 
columns = pd.MultiIndex.from_product([['A', 'B'], ['a', 'b', 'c'], ['x', 'y', 'z']]) 
df = pd.DataFrame(np.random.randint(10, size=(7, 18)), columns=columns) 

idx = pd.IndexSlice 
x = df.loc[:,idx[:,:,'x']] 
y = df.loc[:,idx[:,:,'y']] 
z = df.loc[:,idx[:,:,'z']].values 
result = pd.concat([x-z, y-z], axis=1) 
result = result.rename(columns={'x':'x-z', 'y':'y-z'}) 

收益率

A   B   A   B   
    a b c a b c a b c a b c 
    x-z x-z x-z x-z x-z x-z y-z y-z y-z y-z y-z y-z 
0 1 -1 -1 -1 -5 -1 5 4 -2 3 -8 0 
1 0 1 0 4 -2 1 1 5 1 4 6 0 
2 -5 -9 4 7 -5 -2 -9 -5 4 8 4 4 
3 -5 -2 -6 -6 0 0 -5 -7 0 -4 3 -2 
4 -3 -4 4 -5 -6 8 -2 -1 2 -8 1 1 
5 1 4 -7 7 -4 8 0 2 -8 3 2 5 
6 4 0 -2 1 3 -6 2 5 5 6 -2 -2 
+0

谢谢您的解释! – user3486115