Mahamutha M
Mahamutha M

Reputation: 1287

Pandas dataframe replace column value based on group

I have a dataframe with the below structure,

   master_mac    slave_mac        uuid           rawData               
0  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                         
1  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                         
2  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                          
3  ac233fc01403  ac233f26492b     e2c56db5       ac0228  
4  ac233fc01403  e464eecba5eb     NaN            590080             
5  ac233fc01403  ac233f26492b     e2c56db5       ac0228  
6  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                          
7  ac233fc01403  ac233f26492b     e2c56db5       636800       

The resultant outcome needs to be,

 master_mac    slave_mac        uuid           rawData               
0  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                         
1  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                         
2  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                          
3  ac233fc01403  ac233f26492b     e2c56db5       NaN  
4  ac233fc01403  e464eecba5eb     NaN            590080             
5  ac233fc01403  ac233f26492b     e2c56db5       NaN  
6  ac233fc01403  ac233f26492b     e2c56db5       NaN                                                          
7  ac233fc01403  ac233f26492b     e2c56db5       NaN

Can anyone help me out in this?

Upvotes: 2

Views: 989

Answers (3)

G.G
G.G

Reputation: 765

duckdb

df1.sql.select("master_mac,slave_mac,uuid,case when uuid is null then rawData end rawData")

┌──────────────┬──────────────┬──────────┬─────────┐
│  master_mac  │  slave_mac   │   uuid   │ rawData │
│   varchar    │   varchar    │ varchar  │ varchar │
├──────────────┼──────────────┼──────────┼─────────┤
│ ac233fc01403 │ ac233f26492b │ e2c56db5 │ NULL    │
│ ac233fc01403 │ ac233f26492b │ e2c56db5 │ NULL    │
│ ac233fc01403 │ ac233f26492b │ e2c56db5 │ NULL    │
│ ac233fc01403 │ ac233f26492b │ e2c56db5 │ NULL    │
│ ac233fc01403 │ e464eecba5eb │ NULL     │ 590080  │
│ ac233fc01403 │ ac233f26492b │ e2c56db5 │ NULL    │
│ ac233fc01403 │ ac233f26492b │ e2c56db5 │ NULL    │
│ ac233fc01403 │ ac233f26492b │ e2c56db5 │ NULL    │
└──────────────┴──────────────┴──────────┴─────────┘

Upvotes: 0

jezrael
jezrael

Reputation: 862641

Use:

m = df['uuid'].notna()

If need processes per groups use GroupBy.transform with GroupBy.any for test at least one non NaN per groups:

m = df['uuid'].notna().groupby([df['master_mac'],df['slave_mac']]).transform('any')

df['rawData'] = df['rawData'].mask(m)
print (df)
     master_mac     slave_mac      uuid rawData
0  ac233fc01403  ac233f26492b  e2c56db5     NaN
1  ac233fc01403  ac233f26492b  e2c56db5     NaN
2  ac233fc01403  ac233f26492b  e2c56db5     NaN
3  ac233fc01403  ac233f26492b  e2c56db5     NaN
4  ac233fc01403  e464eecba5eb       NaN  590080
5  ac233fc01403  ac233f26492b  e2c56db5     NaN
6  ac233fc01403  ac233f26492b  e2c56db5     NaN
7  ac233fc01403  ac233f26492b  e2c56db5     NaN

Or:

df.loc[m, 'rawData'] = np.nan

Upvotes: 2

sentence
sentence

Reputation: 8923

If you need to modify for each row the value in column rawData based on the value in column uuid, you could simply do this:

df['rawData'].loc[df['uuid'].notna()] = np.nan

Upvotes: 0

Related Questions