【问题标题】:Replacing values in a 2nd level column on MultiIndex df in Pandas替换 Pandas 中 MultiIndex df 的第二级列中的值
【发布时间】:2017-07-03 22:28:30
【问题描述】:

我正在研究this post,它几乎解决了我的问题。但是,就我而言,我想基于 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

感谢所有提示,在此先感谢您。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以将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 编辑​​:我曾在 cmets 中询问如何考虑多个条件(例如 df.xs('b',axis=1,level=1) &lt; 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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-22
      • 2018-11-11
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      相关资源
      最近更新 更多