Home > Software engineering >  Pandas: Value Counts based on condition
Pandas: Value Counts based on condition

Time:04-02

I want to generate a column count that counts the value of pts group by id. Condition is if x and y both contain NaN corresponding pts will be counted, otherwise it will be ignored.

Sample Df:

   id   pts     x     y
0   1   0.1   NaN   NaN
1   1   0.2   1.0   NaN
2   1   1.1   NaN   NaN
3   2   0.1   NaN   NaN
4   2   0.2   2.0   1.0
5   3   1.1   NaN   NaN
6   3   1.2   NaN   5.0
7   3   3.1   NaN   NaN
8   3   3.2   NaN   NaN
9   4   0.1   NaN   NaN

Expected df:

   id   pts     x     y count
0   1   0.1   NaN   NaN     2
1   1   0.2   1.0   NaN     2
2   1   1.1   NaN   NaN     2
3   2   0.1   NaN   NaN     1
4   2   0.2   2.0   1.0     1
5   3   1.1   NaN   NaN     3
6   3   1.2   NaN   5.0     3
7   3   3.1   NaN   NaN     3
8   3   3.2   NaN   NaN     3
9   4   0.1   NaN   NaN     1

I tried:

df['count'] = df.groupby(['id'])['pts'].value_counts()

CodePudding user response:

You can test if missing values in both Dataframes by DataFrame.isna and DataFrame.all and then count Trues values by sum for new column in GroupBy.transform:

df['count'] = df[['x','y']].isna().all(axis=1).groupby(df['id']).transform('sum')
print (df)
   id  pts    x    y  count
0   1  0.1  NaN  NaN      2
1   1  0.2  1.0  NaN      2
2   1  1.1  NaN  NaN      2
3   2  0.1  NaN  NaN      1
4   2  0.2  2.0  1.0      1
5   3  1.1  NaN  NaN      3
6   3  1.2  NaN  5.0      3
7   3  3.1  NaN  NaN      3
8   3  3.2  NaN  NaN      3
9   4  0.1  NaN  NaN      1

Or chain both masks by & for bitwise AND:

df['count'] = (df['x'].isna() & df['y'].isna()).groupby(df['id']).transform('sum')
print (df)
   id  pts    x    y  count
0   1  0.1  NaN  NaN      2
1   1  0.2  1.0  NaN      2
2   1  1.1  NaN  NaN      2
3   2  0.1  NaN  NaN      1
4   2  0.2  2.0  1.0      1
5   3  1.1  NaN  NaN      3
6   3  1.2  NaN  5.0      3
7   3  3.1  NaN  NaN      3
8   3  3.2  NaN  NaN      3
9   4  0.1  NaN  NaN      1
  • Related