Suppose I have the following DataFrame:
In [1]: df Out[1]: apple banana cherry 0 0 3 good 1 1 4 bad 2 2 5 good
This works as expected:
In [2]: df['apple'][df.cherry == 'bad'] = np.nan In [3]: df Out[3]: apple banana cherry 0 0 3 good 1 NaN 4 bad 2 2 5 good
But this doesn't:
In [2]: df[['apple', 'banana']][df.cherry == 'bad'] = np.nan In [3]: df Out[3]: apple banana cherry 0 0 3 good 1 1 4 bad 2 2 5 good
Why? How can I achieve the conversion of both the 'apple' and 'banana' values without having to write out two lines, as in
In [2]: df['apple'][df.cherry == 'bad'] = np.nan In [3]: df['banana'][df.cherry == 'bad'] = np.nan
Pandas replace multiple values in column replace. By using DataFrame. replace() method we will replace multiple values with multiple new strings or text for an individual DataFrame column. This method searches the entire Pandas DataFrame and replaces every specified value.
You should use loc and do this without chaining:
In [11]: df.loc[df.cherry == 'bad', ['apple', 'banana']] = np.nan In [12]: df Out[12]: apple banana cherry 0 0 3 good 1 NaN NaN bad 2 2 5 good
See the docs on returning a view vs a copy, if you chain the assignment is made to the copy (and thrown away) but if you do it in one loc then pandas cleverly realises you want to assign to the original.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With