我从原始数据开始,如下所示:
Case Final Pre Post
1 A Z X
Z V
2 B
Y
3 A Z Y
Z U
W
4 C W
Z
5 C X Z
X
Z
然后进行向前填充:
df['Case'] = df['Case'].ffill()
像这样:
Case Final Pre Post
1 A Z X
1 Z NaN V
2 B NaN NaN
2 Y NaN NaN
3 A Z Y
3 Z NaN U
3 W NaN NaN
4 C W NaN
4 Z NaN NaN
5 C X Z
5 X NaN NaN
5 Z NaN NaN
我要计算的是该列不为空的每一列的情况:
Case: 5
Final: 5
Pre: 4
Post: 3
输出说明:
1-按第一列Case
分组。
2-即使该列的一个值不为null(包括Case
列本身),也要计数++(将not null的计数增加1)。
答案 0 :(得分:3)
使用:
s = df.notna().groupby(df['Case']).any().sum()
#oldier pandas versions
s = df.notnull().groupby(df['Case']).any().sum()
print (s)
Case 5
Final 5
Pre 4
Post 3
dtype: int64
详细信息:
print (df.notna())
Case Final Pre Post
0 True True True True
1 True True False True
2 True True False False
3 True True False False
4 True True True True
5 True True False True
6 True True False False
7 True True True False
8 True True False False
9 True True True True
10 True True False False
11 True True False False
然后按Case
和DataFrame.notna
进行汇总:
print (df.notnull().groupby(df['Case']).any())
Case Final Pre Post
Case
1 True True True True
2 True True False False
3 True True True True
4 True True True False
5 True True True True
计数sum
的最后True
个值,例如1
。
答案 1 :(得分:3)
怎么样:
grouped = df.groupby('Case', as_index=False)\
.agg(lambda col: col.notnull().any())\
.astype(bool)\
.sum(axis='rows')
我们按'Case'
分组,并计算每列是否有非空值。所以
df.groupby('Case', as_index=False)\
.agg(lambda col: col.notnull().any())
给我们:
Case Final Pre Post
0 1.0 True True True
1 2.0 True False False
2 3.0 True True True
3 4.0 True True False
4 5.0 True True True
使用.astype(bool)
将'Case'
列中的每个值设为True
,因为它们非零,然后与axis='rows'
求和就可以得出每一列的总数(其中True
变为1且False
变为0),给我们:
Case 5
Final 5
Pre 4
Post 3
dtype: int64
答案 2 :(得分:2)
尝试一下:
df.index = df.Case
df.apply(lambda x: len(x[pd.isna(x) == False].index.unique()))
出局:
Case 5
Final 5
Pre 4
Post 3
dtype: int64
答案 3 :(得分:1)
IIUC
df.groupby(df['Case'], as_index=False).any().astype(bool).sum()
Case 5
Final 5
Pre 4
Post 3