Я думаю, что нужно, если MultiIndex
также в индексе сначала проверяет notna
всех значений, а затем проверяет по крайней мере один на первый уровень MultiIndex в столбцах на DataFrameGroupBy.any
и последний счет True
с sum
:
print (df.index)
MultiIndex(levels=[[101, 102], [28, 30]],
labels=[[0, 1], [1, 0]])
df = df.notna().groupby(axis=1, level=0).any().sum(axis=1)
#oldier pandas versions
#df = df.notnull().groupby(axis=1, level=0).any().sum(axis=1)
Если в индексе нет MultiIndex
, добавьте drop
для удаления info
level:
print (df.index)
RangeIndex(start=0, stop=2, step=1)
s = df.drop('info', level=0, axis=1).notnull().groupby(axis=1, level=0).any().sum(axis=1)
print (s)
0 2
1 3
dtype: int64
И если нужно создать столбец по позиции, используйте insert
:
df.insert(2, ('info','count'), s)
print (df)
info '2002' '2003' '2004'
'PID' 'Age' count 't1' 't2' 't1' 't2' 't1' 't2'
0 101 30 2 NaN 2 2 1.0 NaN NaN
1 102 28 3 2.0 5 1 NaN 10.0 100.0