How to get count of nan values in one column and non nan values in other columns using pandas?

Viewed 50

I have a data frame with 4 columns

column1 column2 column3 column4 A 2 3 6 B 3 4 Nan C 5 Nan 6 D 7 Nan Nan E Nan 5 7 F Nan 7 Nan G Nan Nan 9 H Nan Nan Nan

I want to get count of each such combinations in my data frame.

Expected Output:

Count of rows per combination:

Column1 Column2 Column3 Non Nan Non Nan Non Nan

Total rows with above combination :50

Similarly,

Column1 Column2 Column3

Non-Nan Non-Nan Nan - total rows:40

Non-Nan Nan Non-Nan - total rows :50

Non-Nan Nan Nan - total rows :70

Nan Non-Nan Non-Nan - total rows :80

Nan Non-Nan Nan - total rows :60

Nan Nan Non-Nan - total rows :80

Nan Nan Nan - total rows :50

1 Answers

Filter columns for count missing/ non missing values and count values by sum :

df1 = df.drop('column1', axis=1).isna()
df = df.assign(nan = df1.sum(axis=1), nonnan = (~df1).sum(axis=1))
print (df)
  column1  column2  column3  column4  nan  nonnan
0       A      2.0      3.0      6.0    0       3
1       B      3.0      4.0      NaN    1       2
2       C      5.0      NaN      6.0    1       2
3       D      7.0      NaN      NaN    2       1
4       E      NaN      5.0      7.0    1       2
5       F      NaN      7.0      NaN    2       1
6       G      NaN      NaN      9.0    2       1
7       H      NaN      NaN      NaN    3       0

If need count columns:

df = df1.agg(['sum', lambda x: (~x).sum()]).rename({'sum':'nan', '<lambda>':'nonnan'})
print (df)
        column2  column3  column4
nan           4        4        4
nonnan        4        4        4

EDIT:

df1 = df.drop('column1', axis=1)

df1 = (df1.fillna('nan')
          .where(df1.isna(), 'non nan')
          .groupby(df1.columns.tolist())
          .size()
          .reset_index(name='count'))
print (df1)
   column2  column3  column4  count
0      nan      nan      nan      1
1      nan      nan  non nan      1
2      nan  non nan      nan      1
3      nan  non nan  non nan      1
4  non nan      nan      nan      1
5  non nan      nan  non nan      1
6  non nan  non nan      nan      1
7  non nan  non nan  non nan      1
Related