【问题标题】:How to count column values in multiindex data frame based on condition如何根据条件计算多索引数据框中的列值
【发布时间】:2017-11-20 22:02:42
【问题描述】:

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

我会很感激任何提示;)

【问题讨论】:

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


    【解决方案1】:

    一个简单的掩码就足够了,即

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

    输出:

    一个 4 ķ X1 3 X2 3 b X1 0 X2 3 c X1 1 X2 1 数据类型:int64

    【讨论】:

    • 谢谢 :) 并放入我现在使用的数据框pandas.concat([count.to_frame().T, finDF], axis=0)
    猜你喜欢
    • 2018-04-29
    • 2019-11-07
    • 1970-01-01
    • 2020-11-21
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2017-10-21
    相关资源
    最近更新 更多