Pandas version checks
-
[X] I have checked that this issue has not already been reported.
-
[X] I have confirmed this bug exists on the latest version of pandas.
-
[X] I have confirmed this bug exists on the main branch of pandas.
Reproducible Example
import pandas as pd
data1 = pd.Series([True, True, True], dtype=bool)
data2 = pd.Series([False, False, False], dtype=bool)
condition = pd.Series([False, True, False], dtype=bool)
data1[condition] = data2[condition] # > FutureWarning: Setting an item of incompatible dtype...
Issue Description
The assignment data1[condition] = data2[condition]
results in warning claiming incompatible types:
FutureWarning: Setting an item of incompatible dtype is deprecated and will raise an error in a future version of pandas. Value '[False]' has dtype incompatible with bool, please explicitly cast to a compatible dtype first. data1[condition] = data2[condition]
Which is clearly not true. This bug is somewhat related to the one reported in #56600, although the use case is different. Interestingly, the problem disappears when using another dtype, such as int (code below works as expected, no warnings) :
data1 = pd.Series([1 ,2, 3], dtype=int)
data2 = pd.Series([4, 5, 6], dtype=int)
condition = pd.Series([False, True, False], dtype=bool)
data1[condition] = data2[condition]
Note: Reproduced on pandas==2.2.0 and 3.0.0.dev0+292.g70f367194a
Expected Behavior
There should be no warning.
Installed Versions
Comment From: phofl
This actually upcasts to object, which means that the warning is kind of correct, but this should definitely work and continue to work.
I suspect that we do a align under the hood that causes this, cc @MarcoGorelli
Comment From: m0nzderr
@phofl I'm not familiar with the implementation and have no idea about the reasons for the upcast, but, intuitively, I see no reason for that to happen. Both series already have the same dtype, so any conversion would be unnecessary. It is also very counter-intuitive to have different behaviors among primitive types (i.e., no upcast in case of ints or floats, but an upcast in case of bools...).
Comment From: SpoopyPillow
I think what's happening is that when we mask the series, we eventually try to set the items at the index array([1])
to array([False])
(which is the second element of data2). However, this array is an object type. When we try to cast this array to a bool, pandas gives a LossySetitemError, which may be the problem.