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

标签 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])

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

最佳答案

通过掩码进行简单的求和就足够了,即

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

输出:

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

关于python - 如何根据条件计算多索引数据框中的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47392579/

相关文章:

python - 将 dict 的 dict 写入 csv 文件

python - 为什么有时会打印 "Correct!"两次并且不接受输入?

python - 如何选择除最后两个 tr 之外的所有 tr

python - CUDA 驱动程序版本不足 CUDA 运行时版本,CUDA 版本 10.0

python - 将扁平化列表转换为字典列表

python - 如何将图例标签添加为条形图注释?

python-3.x - 如何在列表或字典中存储来自 Gtk.Calendar.get_date() 的日期和来自 Gtk.TextBuffer 的 python 中该日期的文本

python - 我必须从给定的 Dataframe : 中获取 "True"值多于 "False"值的组

python - 如何将 value_count 输出分配给数据框

python - 填充时间序列中缺失的天数(使用重复的键)