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

时间:2017-11-20 12:55:46

标签: python python-3.x pandas dataframe count

我使用Python 3.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])

我很感激任何提示;)

1 个答案:

答案 0 :(得分:3)

通过掩蔽的简单总和就足够了,即

count = ((finDF != '') & (finDF != '.')).sum()

输出:

a        4
k  X1    3
   X2    3
b  X1    0
   X2    3
c  X1    1
   X2    1
dtype: int64