diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 48a5596e00061..ccae46f1e3dde 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -3995,6 +3995,17 @@ def __getitem__(self, key): key = lib.item_from_zerodim(key) key = com.apply_if_callable(key, self) + if ( + isinstance(key, (list, np.ndarray)) + and len(key) > 0 + and any(isinstance(k, bool) for k in key) + and all(isinstance(k, (bool, str)) for k in key) + and not ( + len(key) == len(self.index) and all(isinstance(k, bool) for k in key) + ) + ): + return self.reindex_columns(key) + if is_hashable(key) and not is_iterator(key) and not isinstance(key, slice): # is_iterator to exclude generator e.g. test_getitem_listlike # As of Python 3.12, slice is hashable which breaks MultiIndex (GH#57500) diff --git a/pandas/tests/frame/indexing/test_getitem.py b/pandas/tests/frame/indexing/test_getitem.py index 25d6e06a4c675..5d1744725f114 100644 --- a/pandas/tests/frame/indexing/test_getitem.py +++ b/pandas/tests/frame/indexing/test_getitem.py @@ -101,6 +101,13 @@ def test_getitem_list_duplicates(self): expected = df.iloc[:, 2:] tm.assert_frame_equal(result, expected) + def test_getitem_single_bool_column(self): + # GH#61980 + df = DataFrame({True: [10, 20, 30]}) + result = df[[True]] + expected = DataFrame({True: [10, 20, 30]}) + tm.assert_frame_equal(result, expected) + def test_getitem_dupe_cols(self): df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=["a", "a", "b"]) msg = "\"None of [Index(['baf'], dtype="