Pandas : Proper way to set values based on condition for subset of multiindex dataframe

前端 未结 1 1933
轮回少年
轮回少年 2020-12-08 08:02

I\'m not sure of how to do this without chained assignments (which probably wouldn\'t work anyways because I\'d be setting a copy).

I wan\'t to take a subset of a mu

相关标签:
1条回答
  • 2020-12-08 08:31

    This is an application of (and one of the main motivations for using MultiIndex slicers), see docs here

    In [20]: df = pd.DataFrame({('A','a'): [-1,-1,0,10,12],
                       ('A','b'): [0,1,2,3,-1],
                       ('B','a'): [-20,-10,0,10,20],
                       ('B','b'): [-200,-100,0,100,200]})
    
    In [21]: df
    Out[21]: 
        A      B     
        a  b   a    b
    0  -1  0 -20 -200
    1  -1  1 -10 -100
    2   0  2   0    0
    3  10  3  10  100
    4  12 -1  20  200
    
    In [22]: idx = pd.IndexSlice
    
    In [23]: mask = df.loc[:,idx['A',:]]<0
    
    In [24]: mask
    Out[24]: 
           A       
           a      b
    0   True  False
    1   True  False
    2  False  False
    3  False  False
    4  False   True
    
    In [25]: df[mask] = 0
    
    In [26]: df
    Out[26]: 
        A      B     
        a  b   a    b
    0   0  0 -20 -200
    1   0  1 -10 -100
    2   0  2   0    0
    3  10  3  10  100
    4  12  0  20  200
    

    Since you are working with the 1st level of the columns index, the following will work as well. The above example is more general, say you wanted to do this for 'a'.

    In [30]: df[df[['A']]<0] = 0
    
    In [31]: df
    Out[31]: 
        A      B     
        a  b   a    b
    0   0  0 -20 -200
    1   0  1 -10 -100
    2   0  2   0    0
    3  10  3  10  100
    4  12  0  20  200
    
    0 讨论(0)
提交回复
热议问题