[英]How to count non-null columns per group?
我從看起來像這樣的原始數據開始:
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- 即使該列的一個值不為空(包括Case
列本身),然后 count++ (將非空計數增加 1)。
用:
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
詳情:
首先通過DataFrame.notna
檢查非缺失值:
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
與GroupBy.any
:
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
以及 count True
進程的最后一個sum
值,如1
。
怎么樣:
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
嘗試這個:
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
國際大學聯盟
df.groupby(df['Case'], as_index=False).any().astype(bool).sum()
Case 5
Final 5
Pre 4
Post 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.