基于对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
答案 0 :(得分:1)
我认为你可以通过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