我正在研究这篇文章,这几乎解决了我的问题。但是,就我而言,我想根据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
分配给所有列a
和b
,其中b<0
。我是根据:df.xs('b',axis=1,level=1)<b
选择它们的,但是我实际上无法执行替换。但是,我的1级名称有所不同,因此在那里无法根据A
和B
进行索引,但可能是通过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.mask
与reindex
一起使用与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) < 0
或df.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())