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

倖福魔咒の 提交于 2019-12-13 02:27:37

问题


Based on a thorough and accurate response to this question, I am now faced with a new issue based on slightly different data. Given this data frame:

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

I'd like to subtract 4 from 'possible', per row, for any instance (column) where the value is 'n/a' for that row (and then change all 'n/a' values to 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

Some conditions: It may occur that a column is all floats (though they appear to be integers upon inspection). This was not factored into the original question.

It may also occur that a row contains two instances (columns) of 'n/a' values. This was addressed by the previous solution.

Here is the previous solution:

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) 

It works, except for where a column (A or B) contains all floats (seemingly integers). When that's the case, this error occurs:

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

回答1:


I think you can add casting to string by astype to condition:

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


来源:https://stackoverflow.com/questions/37096398/pandas-multi-index-subtract-from-value-based-on-value-in-other-column-part-2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!