在熊猫中的多索引DF上的第二级列中替换值



我正在研究这篇文章,这几乎解决了我的问题。但是,就我而言,我想根据DF的第二级工作,但尝试不明确指定我的第一级列名。

借用原始数据框:

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]})
##df
    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

我想将NA分配给所有列ab,其中b<0。我是根据:df.xs('b',axis=1,level=1)<b选择它们的,但是我实际上无法执行替换。但是,我的1级名称有所不同,因此在那里无法根据AB进行索引,但可能是通过df.columns.values

进行的。

所需的输出将为

##df
    A   B
    a   b   a   b
0   -1  0   NA  NA
1   -1  1   NA  NA
2   0   2   0   0
3   10  3   10  100
4   NA  NA  20  200

我感谢所有提示,谢谢您。

您可以将DataFrame.maskreindex一起使用与reindex创建的原始DataFrame相同的索引和列名:

mask = df.xs('b',axis=1,level=1) < 0
print (mask)
       A      B
0  False   True
1  False   True
2  False  False
3  False  False
4   True  False
print (mask.reindex(columns = df.columns, level=0))
       A             B       
       a      b      a      b
0  False  False   True   True
1  False  False   True   True
2  False  False  False  False
3  False  False  False  False
4   True   True  False  False
df = df.mask(mask.reindex(columns = df.columns, level=0))
print (df)
      A          B       
      a    b     a      b
0  -1.0  0.0   NaN    NaN
1  -1.0  1.0   NaN    NaN
2   0.0  2.0   0.0    0.0
3  10.0  3.0  10.0  100.0
4   NaN  NaN  20.0  200.0

通过op 编辑:我在评论中问了如何考虑多种条件(例如df.xs('b',axis=1,level=1) < 0df.xs('b',axis=1,level=1)NA)。@Jezrael表示,如果我想这样做,我应该考虑

mask=(df.xs('b',axis=1,level=1) < 0 | df.xs('b',axis=1,level=1).isnull())

最新更新