如何根据条件计算多索引数据帧中的列值

2024-05-19 10:09:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python3.6.1。 我有这样一个数据框:

        a  k     b     c   
          X1 X2 X1 X2 X1 X2
    0  AB  1  2  .  o      
    1  CD  2  1  .  o      
    2  EF  3  .        o  .
    3  GH  .  3  .  o  .  o

我想为第二级的每一列计算不同于空白('')和点('.')的值。当我使用count()时,我得到:

    a        4
    k  X1    4
       X2    4
    b  X1    4
       X2    4
    c  X1    4
       X2    4

但我需要这个:

    a        4
    k  X1    3
       X2    3
    b  X1    0
       X2    3
    c  X1    1
       X2    1

最好是得到一个包含计数的新行(在数据的正上方或正下方)的数据帧,如下所示:

        a  k     b     c   
          X1 X2 X1 X2 X1 X2
        4  3  3  0  3  1  1
    0  AB  1  2  .  o      
    1  CD  2  1  .  o      
    2  EF  3  .        o  .
    3  GH  .  3  .  o  .  o

以下是创建初始数据帧的代码:

    import numpy
    import pandas
    X1 = pandas.DataFrame(data=[['AB',1,'.','o'],['CD',2,'.','o'],['EF',3,'.','o']],
                          columns=['a','k','b','c'])
    X2 = pandas.DataFrame(data=[['CD',1,'o','o'],['AB',2,'o','o'],['GH',3,'o','o']],
                          columns=['a','k','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')
    myDF = myDF.fillna('.')
    kDF = myDF[['k']]
    operDF = myDF.drop('k', axis=1, level=0).set_index('a').stack(0)\
            .pipe(lambda d: d.mask(d.X1 == d.X2, '')).unstack()\
            .swaplevel(0,1,axis=1).sort_index(axis=1,level=0)\
            .reset_index()
    finDF = pandas.concat([kDF, operDF], axis=1)
    cols = list(finDF)
    cols[0], cols[1], cols[2] = cols[2], cols[0], cols[1]
    finDF = finDF.ix[:,cols]
    finDF['a'] = finDF['a'].map(lambda x: x[0])

如果有任何提示,我将不胜感激;)


Tags: columns数据pandasindexabcdghx1

热门问题