Skip to content

Commit 7981f2c

Browse files
authored
fix Dataframe.__setitem__ with Hashable (#1535)
* StrLike -> Hashable * swap overload order * write test * reinstate test * list -> Iterable, remove non-intended test case * sync
1 parent 7c90b93 commit 7981f2c

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

pandas-stubs/core/frame.pyi

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -283,9 +283,7 @@ class _LocIndexerFrame(_LocIndexer, Generic[_T]):
283283
@overload
284284
def __setitem__(
285285
self,
286-
key: (
287-
MaskType | StrLike | _IndexSliceTuple | list[ScalarT] | IndexingInt | slice
288-
),
286+
key: tuple[_IndexSliceTuple, Hashable],
289287
value: (
290288
Scalar
291289
| NAType
@@ -294,15 +292,21 @@ class _LocIndexerFrame(_LocIndexer, Generic[_T]):
294292
| IndexOpsMixin
295293
| Sequence[Scalar]
296294
| Sequence[Sequence[Scalar]]
297-
| DataFrame
298295
| Mapping[Hashable, Scalar | NAType | NaTType]
299296
| None
300297
),
301298
) -> None: ...
302299
@overload
303300
def __setitem__(
304301
self,
305-
key: tuple[_IndexSliceTuple, Hashable],
302+
key: (
303+
MaskType
304+
| Hashable
305+
| _IndexSliceTuple
306+
| Iterable[Scalar]
307+
| IndexingInt
308+
| slice
309+
),
306310
value: (
307311
Scalar
308312
| NAType
@@ -311,6 +315,7 @@ class _LocIndexerFrame(_LocIndexer, Generic[_T]):
311315
| IndexOpsMixin
312316
| Sequence[Scalar]
313317
| Sequence[Sequence[Scalar]]
318+
| DataFrame
314319
| Mapping[Hashable, Scalar | NAType | NaTType]
315320
| None
316321
),
@@ -848,9 +853,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
848853
@overload
849854
def __setitem__(
850855
self,
851-
idx: (
852-
MaskType | StrLike | _IndexSliceTuple | list[ScalarT] | IndexingInt | slice
853-
),
856+
idx: tuple[_IndexSliceTuple, Hashable],
854857
value: (
855858
Scalar
856859
| NAType
@@ -859,15 +862,21 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
859862
| IndexOpsMixin
860863
| Sequence[Scalar]
861864
| Sequence[Sequence[Scalar]]
862-
| DataFrame
863865
| Mapping[Hashable, Scalar | NAType | NaTType]
864866
| None
865867
),
866868
) -> None: ...
867869
@overload
868870
def __setitem__(
869871
self,
870-
idx: tuple[_IndexSliceTuple, Hashable],
872+
idx: (
873+
MaskType
874+
| Hashable
875+
| _IndexSliceTuple
876+
| Iterable[Scalar]
877+
| IndexingInt
878+
| slice
879+
),
871880
value: (
872881
Scalar
873882
| NAType
@@ -876,6 +885,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
876885
| IndexOpsMixin
877886
| Sequence[Scalar]
878887
| Sequence[Sequence[Scalar]]
888+
| DataFrame
879889
| Mapping[Hashable, Scalar | NAType | NaTType]
880890
| None
881891
),

tests/test_frame.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,16 @@ def test_slice_setitem() -> None:
290290

291291
def test_types_setitem() -> None:
292292
df = pd.DataFrame(data={"col1": [1, 2], "col2": [3, 4], 5: [6, 7]})
293+
h = cast(Hashable, "col1")
293294
i = pd.Index(["col1", "col2"])
294295
s = pd.Series(["col1", "col2"])
295296
a = np.array(["col1", "col2"])
296297
df["col1"] = [1, 2]
297298
df[5] = [5, 6]
299+
df[h] = [5, 6]
300+
df.loc[:, h] = [5, 6]
301+
df.loc[:, UserList([h])] = [[5], [6]]
302+
df.loc[:, iter([h])] = [[5], [6]]
298303
df[["col1", "col2"]] = [[1, 2], [3, 4]]
299304
df[s] = [5, 6]
300305
df.loc[:, s] = [5, 6]

0 commit comments

Comments
 (0)