diff --git a/pandas/core/frame.py b/pandas/core/frame.py index b0909e23b44c5..eb8e6a70bb54e 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -6464,7 +6464,7 @@ def melt( # ---------------------------------------------------------------------- # Time series-related - def diff(self, periods=1, axis=0) -> "DataFrame": + def diff(self, periods: int = 1, axis: Axis = 0) -> "DataFrame": """ First discrete difference of element. diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 8d56311331d4d..9720819adeb16 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -8587,12 +8587,15 @@ def _where( for dt in cond.dtypes: if not is_bool_dtype(dt): raise ValueError(msg.format(dtype=dt)) + else: + # GH#21947 we have an empty DataFrame, could be object-dtype + cond = cond.astype(bool) cond = -cond if inplace else cond # try to align with other try_quick = True - if hasattr(other, "align"): + if isinstance(other, NDFrame): # align with me if other.ndim <= self.ndim: diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 93d4b02310d54..3a7ab98ea6baf 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -569,8 +569,8 @@ def setitem(self, indexer, value) -> "BlockManager": def putmask(self, **kwargs): return self.apply("putmask", **kwargs) - def diff(self, **kwargs) -> "BlockManager": - return self.apply("diff", **kwargs) + def diff(self, n: int, axis: int) -> "BlockManager": + return self.apply("diff", n=n, axis=axis) def interpolate(self, **kwargs) -> "BlockManager": return self.apply("interpolate", **kwargs) diff --git a/pandas/core/series.py b/pandas/core/series.py index 2d8eb9b29498a..1c815fa8f52f5 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -872,6 +872,7 @@ def __getitem__(self, key): if com.is_bool_indexer(key): key = check_bool_indexer(self.index, key) + key = np.asarray(key, dtype=bool) return self._get_values(key) return self._get_with(key) @@ -993,6 +994,7 @@ def __setitem__(self, key, value): if com.is_bool_indexer(key): key = check_bool_indexer(self.index, key) + key = np.asarray(key, dtype=bool) try: self._where(~key, value, inplace=True) return @@ -2240,7 +2242,7 @@ def cov(self, other, min_periods=None) -> float: return np.nan return nanops.nancov(this.values, other.values, min_periods=min_periods) - def diff(self, periods=1) -> "Series": + def diff(self, periods: int = 1) -> "Series": """ First discrete difference of element. diff --git a/pandas/tests/frame/indexing/test_where.py b/pandas/tests/frame/indexing/test_where.py index eee754a47fb8c..bbf8ee5978e7c 100644 --- a/pandas/tests/frame/indexing/test_where.py +++ b/pandas/tests/frame/indexing/test_where.py @@ -397,7 +397,8 @@ def test_where_none(self): def test_where_empty_df_and_empty_cond_having_non_bool_dtypes(self): # see gh-21947 df = pd.DataFrame(columns=["a"]) - cond = df.applymap(lambda x: x > 0) + cond = df + assert (cond.dtypes == object).all() result = df.where(cond) tm.assert_frame_equal(result, df)