a = pd.DataFrame({
"one":[np.NAN,np.NAN,"e"],
"two":["a","s","d"],
"three":[1,2,2]
})
| one | two | three | |
|---|---|---|---|
| 0 | nan | a | 1 |
| 1 | nan | s | 2 |
| 2 | e | d | 2 |
I want to change values in column "one" that meet conditions below
- a["one"] is null.
- a["three] is 1.
so i used boolean indexing.
a[(a["one"].isnull()) & (a["three"]==1)]
| one | two | three | |
|---|---|---|---|
| 0 | nan | a | 1 |
a[(a["one"].isnull()) & (a["three"]==1)].loc[a["one"]!=a["one"], "one"]
| one | |
|---|---|
| 0 | nan |
a[(a["one"].isnull()) & (a["three"]==1)].loc[a["one"]!=a["one"], "one"] = "replaced"
But dataframe "a" is still "a". Nan value isn’t replaced as "replaced". nothing changed.
I want to know why.
>Solution :
But dataframe "a" is still "a". Nan value isn’t replaced as "replaced". nothing changed. I want to know why.
If check evaluation order matters there is explained you assign to view a[(a["one"].isnull()) & (a["three"]==1)] not to original DataFrame.
Correct way is use DataFrame.loc for set by boolean mask and columns name:
a.loc[a["one"].isna() & (a["three"]==1), "one"] = "replaced"
print (a)
one two three
0 replaced a 1
1 NaN s 2
2 e d 2