我使用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])
我很感激任何提示;)
答案 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