Danish
Danish

Reputation: 2871

Filter the rows based on the missing values on the specific set columns - pandas

I have data frame as shown below

ID       Type         Desc         D_N    D_A    C_N     C_A
1        Edu          Education    3      100    NaN     NaN
1        Bank         In_Pay       NaN    NaN    NaN     900
1        Eat          Food         4      200    NaN     NaN
1        Edu          Education    NaN    NaN    NaN     NaN
1        Bank         NaN          NaN    NaN    4       700
1        Eat          Food         NaN    NaN    NaN     NaN
2        Edu          Education    NaN    NaN    1       100
2        Bank         NaN          NaN    NaN    8       NaN
2        NaN          Food         4      NaN    NaN     NaN
3        Edu          Education    NaN    NaN    NaN     NaN
3        Bank         NaN          2      300    NaN     NaN
3        Eat          Food         NaN    140    NaN     NaN

From the above df, I would like to filter the rows where exactly one of the columns D_N, D_A, C_N and C_A has non zero.

Expected Output:

ID       Type         Desc         D_N    D_A    C_N     C_A
1        Bank         In_Pay       NaN    NaN    NaN     900
2        Bank         NaN          NaN    NaN    8       NaN
2        NaN          Food         4      NaN    NaN     NaN
3        Eat          Food         NaN    140    NaN     NaN

I tried the below code but that does not work.

df[df.loc[:, ["D_N", "D_A", "C_N", "C_A"]].isna().sum(axis=1).eq(1)]

Upvotes: 0

Views: 51

Answers (1)

jezrael
jezrael

Reputation: 862921

Use DataFrame.count for count values excluded missing values:

df1 = df[df[["D_N", "D_A", "C_N", "C_A"]].count(axis=1).eq(1)]
print (df1)
    ID  Type    Desc  D_N    D_A  C_N    C_A
1    1  Bank  In_Pay  NaN    NaN  NaN  900.0
7    2  Bank     NaN  NaN    NaN  8.0    NaN
8    2   NaN    Food  4.0    NaN  NaN    NaN
11   3   Eat    Food  NaN  140.0  NaN    NaN

Your solution is possible modify with test non missing values:

df1 = df[df[["D_N", "D_A", "C_N", "C_A"]].notna().sum(axis=1).eq(1)]

Upvotes: 1

Related Questions