根据其他第2部分中的值,Pandas多指数从值中减去

时间:2016-05-08 05:03:40

标签: python-3.x pandas multi-index

基于对this question的全面而准确的回复,我现在面临一个基于略有不同数据的新问题。 鉴于此数据框:

df = pd.DataFrame({
    ('A', 'a'): [23,3,54,7,32,76],
    ('B', 'b'): [23,'n/a',54,7,32,76],
    ('possible','possible'):[100,100,100,100,100,100]
    })
df
    A       B   possible
    a       b   possible
0   23      23      100
1   3       n/a     100
2   54      54      100
3   7       n/a     100
4   32      32      100
5   76      76      100

我希望从每行可能的'中减去4对于任何值为' n / a'的实例(列)。对于该行(然后将所有' n / a'值更改为0)。

    A       B   possible
    a       b   possible
0   23      23      100
1   3       n/a     96
2   54      54      100
3   7       n/a     96
4   32      32      100
5   76      76      100

某些条件: 可能会出现一个列都是浮点数(尽管它们在检查时看起来是整数)。这不是原始问题的因素。

也可能会出现一行包含' n / a'的两个实例(列)。值。这是通过以前的解决方案解决的。

这是以前的解决方案:

idx = pd.IndexSlice
df.loc[:, idx['possible', 'possible']] -= (df.loc[:, idx[('A','B'),:]] == 'n/a').sum(axis=1) * 4
df.replace({'n/a':0}, inplace=True) 

除了列(A或B)包含所有浮点数(看似整数)之外,它都有效。如果是这种情况,则会发生此错误:

TypeError: Could not compare ['n/a'] with block values

1 个答案:

答案 0 :(得分:1)

我认为你可以通过astypestring添加投射来条件:

idx = pd.IndexSlice
df.loc[:, idx['possible', 'possible']] -= 
(df.loc[:, idx[('A','B'),:]].astype(str) == 'n/a').sum(axis=1) * 4
df.replace({'n/a':0}, inplace=True) 
print df    
    A   B possible
    a   b possible
0  23  23      100
1   3   0       96
2  54  54      100
3   7   0       96
4  32  32      100
5  76  76      100