我使用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/