我有以下数据框,其中我试图计算按A,B和C分组的每列的“ MISSING”值的总数,但我尝试将其保持在以下格式,我不确定如果我必须重塑数据框或使用堆栈:
A B C D E F
0 Miami Heat FL Basketball 21 MISSING MISSING
1 Miami Heat FL Basketball 17 MISSING MISSING
2 Miami Heat FL Basketball MISSING 12 23
3 Orlando Magic FL Basketball MISSING 5 MISSING
4 Orlando Magic FL Basketball 10 MISSING MISSING
5 Orlando Magic FL Basketball 5 MISSING MISSING
这就是我想要的结果:
A B Column Name Missing Count
Miami Heat FL D 1
Miami Heat FL E 2
Miami Heat FL F 2
Orlando Magic FL D 1
Orlando Magic FL E 2
Orlando Magic FL F 3
此代码不起作用:
df = finalDF.assign(Missing Count = finalDF.eq("MISSING").sum(axis=1))
.groupby(['A','B','C']) ['Missing Count'].count()
答案 0 :(得分:0)
使用:
new_df = (df.assign(**df[['D', 'E', 'F']].isnull())
.pivot_table(index=['A', 'B'], values=['D', 'E', 'F'], aggfunc='sum')
.reset_index()
.melt(['A', 'B'], var_name='Column Name', value_name='Missing Count')
.sort_values('A'))
print(new_df)
A B Column Name Missing Count
0 Miami Heat FL D 1.0
2 Miami Heat FL E 2.0
4 Miami Heat FL F 2.0
1 Orlando Magic FL D 1.0
3 Orlando Magic FL E 2.0
5 Orlando Magic FL F 3.0
如果不是NaN
df[['D', 'E', 'F']].eq('MISSING')
第一步:DataFrame.assign
和**
:
print(df.assign(**df[['D', 'E', 'F']].isnull()))
A B C D E F
0 Miami_Heat FL Basketball False True True
1 Miami_Heat FL Basketball False True True
2 Miami_Heat FL Basketball True False False
3 Orlando_Magic FL Basketball True False True
4 Orlando_Magic FL Basketball False True True
5 Orlando_Magic FL Basketball False True True
这是一种动态方式,可以在我们要计算缺失值的列中使用True
或False
创建DataFrame。要了解**
,您可以看到:What is the purpose and use of **kwargs?和What does ** (double star/asterisk) and * (star/asterisk) do for parameters?
第二步
现在我们可以计数,一种简单的方法是使用DataFrame.pivot_table
,我们也可以使用groupby
。
print(df.assign(**df[['D', 'E', 'F']].isnull())
.pivot_table(index=['A', 'B'], values=['D', 'E', 'F'],aggfunc='sum'))
D E F
A B
Miami_Heat FL 1.0 2.0 2.0
Orlando_Magic FL 1.0 2.0 3.0
我建议您查看:How pivot a DataFrame
最后:使用DataFrame.melt
的DataFrame.reset_index
以前不会丢失有关index
的信息。
print(df.assign(**df[['D', 'E', 'F']].isnull())
.pivot_table(index=['A', 'B'], values=['D', 'E', 'F'], aggfunc = 'sum')
.reset_index()
.melt(['A', 'B'], var_name='Column Name', value_name='Missing Count'))
A B Column Name Missing Count
0 Miami_Heat FL D 1.0
1 Orlando_Magic FL D 1.0
2 Miami_Heat FL E 2.0
3 Orlando_Magic FL E 2.0
4 Miami_Heat FL F 2.0
5 Orlando_Magic FL F 3.0
也许在这里DataFrame.stack
+ reset_index
也可以很好地工作。但是我们需要.rename_axis(columns = 'Column Name')
之前的.rename('Missing Count')
之前的reset_index
DataFrame.sort_values
,以便对预期的输出进行排序。
我们也可以先融化再计数。...
答案 1 :(得分:0)
df = pd.melt(df, id_vars=['A','B'])
df.rename(columns={'variable':'Column Name'}, inplace=True)
df[df['value']=='MISSING'].groupby(['A','B', 'Column Name']).count().reset_index()