Pandas 基于其他列第 2 部分中的值从值中减去多索引

Pandas multi-index subtract from value based on value in other column part 2

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

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

我想从每行 'possible' 中减去 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

我认为您可以通过 astype 将转换添加到 string 到条件:

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