如何根据 Python 中的条件将数据框中的值替换为 2 级列



我使用 Python 3.6.1。这是我的数据框 myDF 我想为其操作值:

    a     b          c      
    a    X1    X2   X1    X2
 0  10    .     o    o     o
 1  20    .     o    o     o
 2  30    .     o    o     o

如您所见,级别 0 上有列"a"、"b"、"c",级别 1 上有列"a"、"X1"、"X2"。

我需要比较 X1 中的值是否等于 b/c 下 X2 中的相应值,如果是,请删除这些值。因此,对上述数据帧的操作应返回以下内容:

    a     b          c      
    a    X1    X2   X1    X2
 0  10    .     o         
 1  20    .     o         
 2  30    .     o         

以下是获取源数据框的方法:

import numpy
import pandas
X1 = pandas.DataFrame(data=[[10,'.','o'],[20,'.','o'],[30,'.','o']],
                      columns=['a','b','c'])
X2 = pandas.DataFrame(data=[[10,'o','o'],[20,'o','o'],[30,'o','o']],
                      columns=['a','b','c'])
myDF = pandas.concat([X1.set_index('a'), X2.set_index('a')],
                     axis='columns', keys=['X1','X2'])
myDF = myDF.swaplevel(axis='columns')[X1.columns[1:]]
myDF = myDF.reset_index(col_level=1, col_fill='a')

到目前为止,我尝试的是:

other = myDF.xs('X1', axis=1, level=-1)
main = numpy.where(myDF.eq(other, level=0), 'x', 'y')
pandas.DataFrame(main, index=myDF.index, columns=myDF.columns)

这给了:

   a    b          c      
   a   X1    X2   X1    X2
0  F    T     F    T     T
1  F    T     F    T     T
2  F    T     F    T     T

并且不知道如何前进...

我的整个目标是创建一个包含两列的临时数据帧,['X1', 'X2']这样我就可以屏蔽它们相等的行。 这让我得到了两列:

myDF.set_index(('a', 'a')).stack(0)
         X1 X2
(a, a)        
10     b  .  o
       c  o  o
20     b  .  o
       c  o  o
30     b  .  o
       c  o  o

我可以将其保存到临时名称,然后在其他几行中进行操作。 或者我可以按照pipe执行任务.

myDF.set_index(('a', 'a')).stack(0).pipe(
    lambda d: d.mask(d.X1 == d.X2, '')
)
         X1 X2
(a, a)        
10     b  .  o
       c      
20     b  .  o
       c      
30     b  .  o
       c      

剩下的只是会计工作,让事情回到原位。

myDF.set_index(('a', 'a')).stack(0).pipe(
    lambda d: d.mask(d.X1 == d.X2, '')
).unstack().swaplevel(0, 1, 1).sort_index(1).reset_index()
    a  b     c   
    a X1 X2 X1 X2
0  10  .  o      
1  20  .  o      
2  30  .  o      

相关内容

  • 没有找到相关文章

最新更新