熊猫分组条件并重新塑造数据框

时间:2020-02-20 18:16:54

标签: python pandas

我有以下数据框,其中我试图计算按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()

2 个答案:

答案 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

这是一种动态方式,可以在我们要计算缺失值的列中使用TrueFalse创建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.meltDataFrame.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()