Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
2c761eb
REF: setitem_with_indexer always use same path for 2D
jbrockmendel Dec 28, 2020
d207a12
Merge branch 'master' of https://github.com/pandas-dev/pandas into re…
jbrockmendel Jan 6, 2021
f0dae4d
Merge branch 'master' of https://github.com/pandas-dev/pandas into re…
jbrockmendel Jan 8, 2021
27bd89d
fixed xfail
jbrockmendel Jan 8, 2021
a5c1f5e
REF: DataFrame._setitem_array dont use iloc.__setitem__
jbrockmendel Jan 27, 2021
15f5265
REF: DataFrame._setitem_array dont use iloc.__setitem__
jbrockmendel Jan 31, 2021
73302c0
Merge branch 'master' of https://github.com/pandas-dev/pandas into se…
jbrockmendel Jan 31, 2021
ceeeb78
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Jan 31, 2021
6b304b8
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 2, 2021
fe9be7e
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 2, 2021
1789fca
mypy fixup
jbrockmendel Feb 2, 2021
6400be3
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 2, 2021
a1cdd19
mypy fixup
jbrockmendel Feb 2, 2021
870ae37
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 2, 2021
c32a427
32bit compat
jbrockmendel Feb 2, 2021
d9d8beb
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 2, 2021
8a283d9
troubleshoot windows builds
jbrockmendel Feb 2, 2021
9718f6e
Merge branch 'master' of https://github.com/pandas-dev/pandas into se…
jbrockmendel Feb 3, 2021
9f6d8e7
troubleshoot 32bit
jbrockmendel Feb 3, 2021
dd53abc
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 3, 2021
f6b09b4
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 7, 2021
c107e77
TST: missed raising cases
jbrockmendel Feb 7, 2021
ae3ae1b
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 18, 2021
c631079
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 23, 2021
4cfe863
port phofl tests
jbrockmendel Feb 23, 2021
03e6eb9
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 25, 2021
d280f60
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 26, 2021
9db5537
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 27, 2021
4054aea
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Feb 27, 2021
bd76479
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Mar 4, 2021
7ea792f
whatsnew
jbrockmendel Mar 4, 2021
20f6a16
clarify whatsnew
jbrockmendel Mar 4, 2021
b9daceb
merge but not passing...
jbrockmendel Mar 5, 2021
6117e8e
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 5, 2021
94b33a8
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 5, 2021
8f71f27
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 5, 2021
17049e4
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 6, 2021
fdbf6f3
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Mar 7, 2021
f8363f9
Merge branch 'setitem-frame-no-defer' into ref-indexing-2
jbrockmendel Mar 7, 2021
2c6da5d
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Mar 8, 2021
2d0cf9e
comment
jbrockmendel Mar 8, 2021
e1ed083
whatsnew
jbrockmendel Mar 8, 2021
df9d87f
checkpoint passing
jbrockmendel Mar 9, 2021
aeb687c
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 9, 2021
481ece1
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 9, 2021
95f34c8
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 11, 2021
be54f15
Fix dtype in loc-setitem-with-expansion
jbrockmendel Mar 11, 2021
6896e86
Merge branch 'master' into setitem-frame-no-defer
jbrockmendel Mar 12, 2021
b183084
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 12, 2021
fa2006b
ArrayManager compat
jbrockmendel Mar 12, 2021
1af8686
xfail only for BM
jbrockmendel Mar 13, 2021
301d582
Merge branch 'setitem-frame-no-defer' into ref-indexing-2
jbrockmendel Mar 13, 2021
1d24f71
mypy fixup
jbrockmendel Mar 13, 2021
d8c7c4c
special case ArrayManager
jbrockmendel Mar 13, 2021
f0037e6
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 15, 2021
094e47d
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 17, 2021
6791a97
ArrayManager compat
jbrockmendel Mar 17, 2021
d01951d
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 22, 2021
01ff673
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 24, 2021
8e8e711
arraymanager compat for tests
jbrockmendel Mar 24, 2021
18d72ec
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 31, 2021
ba1d17c
Merge branch 'master' into ref-indexing-2
jbrockmendel Mar 31, 2021
1fca2d5
Merge branch 'master' into ref-indexing-2
jbrockmendel Apr 1, 2021
1382985
Merge branch 'master' into ref-indexing-2
jbrockmendel Apr 2, 2021
10ab24d
merge master
jbrockmendel Apr 2, 2021
8e5a414
Merge branch 'master' into ref-indexing-2
jbrockmendel Apr 3, 2021
cdfc811
Merge branch 'master' into ref-indexing-2
jbrockmendel Apr 7, 2021
d761df6
Merge branch 'master' into ref-indexing-2
jbrockmendel Apr 12, 2021
b4d0211
Merge branch 'master' into ref-indexing-2
jbrockmendel Apr 16, 2021
53be486
Merge branch 'master' into ref-indexing-2
jbrockmendel May 10, 2021
05107a2
Merge branch 'master' into ref-indexing-2
jbrockmendel May 12, 2021
b87fc55
Merge branch 'master' into ref-indexing-2
jbrockmendel Jun 4, 2021
3279159
Merge branch 'master' into ref-indexing-2
jbrockmendel Jun 16, 2021
9f7e274
Merge branch 'master' into ref-indexing-2
jbrockmendel Jun 24, 2021
a4aed44
Merge branch 'master' into ref-indexing-2
jbrockmendel Jul 24, 2021
e1c30fa
Merge branch 'master' of https://github.com/pandas-dev/pandas into re…
jbrockmendel Jul 29, 2021
e062dce
Merge branch 'master' into ref-indexing-2
jbrockmendel Jul 30, 2021
9a73ef6
update incorrect tests
jbrockmendel Jul 30, 2021
4a9919b
Merge remote-tracking branch 'upstream/master' into ref-indexing-2
jbrockmendel Jul 30, 2021
8761ffa
docstring, comment
jbrockmendel Jul 31, 2021
99e3316
Merge remote-tracking branch 'upstream/master' into ref-indexing-2
jbrockmendel Jul 31, 2021
be22a99
Merge branch 'master' into ref-indexing-2
jbrockmendel Aug 4, 2021
86d3e71
Merge branch 'master' into ref-indexing-2
jbrockmendel Aug 17, 2021
d49512b
Merge branch 'master' into ref-indexing-2
jbrockmendel Aug 23, 2021
d821e8b
REF: implement mask_setitem_value
jbrockmendel Sep 18, 2021
f142f16
Merge branch 'master' into ref-indexing-2
jbrockmendel Sep 18, 2021
eccfebb
Merge branch 'ref-indexing-bool' into ref-indexing-2
jbrockmendel Sep 18, 2021
0c430c9
Merge branch 'master' into ref-indexing-2
jbrockmendel Sep 30, 2021
295737e
Merge branch 'master' into ref-indexing-2
jbrockmendel Oct 4, 2021
405b21f
Merge branch 'master' into ref-indexing-2
jbrockmendel Oct 19, 2021
520230c
Merge branch 'master' into ref-indexing-2
jbrockmendel Oct 19, 2021
0ac5516
fix last tesst
jbrockmendel Oct 19, 2021
7a46ab8
Merge branch 'master' into ref-indexing-2
jbrockmendel Oct 31, 2021
b19a787
Merge branch 'master' into ref-indexing-2
jbrockmendel Nov 1, 2021
7bf721b
Merge branch 'master' into ref-indexing-2
jbrockmendel Nov 1, 2021
7db1a5a
ArrayManager cases
jbrockmendel Nov 1, 2021
ca0f516
Merge branch 'master' into ref-indexing-2
jbrockmendel Nov 7, 2021
3b456f9
remove _isetitem
jbrockmendel Nov 7, 2021
1e4b617
Merge branch 'master' into ref-indexing-2
jbrockmendel Nov 9, 2021
1d203a6
Merge branch 'master' into ref-indexing-2
jbrockmendel Nov 29, 2021
4e69970
fixup missing fixture
jbrockmendel Nov 29, 2021
0a0e712
un-xfail for ArrayManager
jbrockmendel Nov 30, 2021
4ce2cd3
fix incorrect test
jbrockmendel Nov 30, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
checkpoint passing
  • Loading branch information
jbrockmendel committed Mar 9, 2021
commit df9d87fe8a172eebeb45434522f46d412534b88c
17 changes: 16 additions & 1 deletion pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -4950,12 +4950,27 @@ def _replace_columnwise(
target, value = mapping[ax[i]]
newobj = ser.replace(target, value, regex=regex)

res.iloc[:, i] = newobj
res._isetitem(i, newobj)

if inplace:
return
return res.__finalize__(self)

def _isetitem(self, loc: int, value):
cols = self.columns
if cols.is_unique:
col = cols[loc]
self[col] = value
return

# Otherwise we temporarily pin unique columns and call __setitem__
newcols = Index(range(len(cols)))
try:
self.columns = newcols
self[loc] = value
finally:
self.columns = cols
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of this "workaround", should we have a manager method to set a new column based on a position? (basically what mgr.iset does for ArrayManager)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 on this

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sure.

this is a fairly low priority, posted in the hopes it would help joris with ArrayManager indexing. #40456 is the most blockery of the things I have going ATM.


@doc(NDFrame.shift, klass=_shared_doc_kwargs["klass"])
def shift(
self,
Expand Down
2 changes: 2 additions & 0 deletions pandas/core/indexers.py
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,8 @@ def length_of_indexer(indexer, target=None) -> int:
# GH#25774
return indexer.sum()
return len(indexer)
elif isinstance(indexer, range):
return (indexer.stop - indexer.start) // indexer.step
elif not is_list_like_indexer(indexer):
return 1
raise AssertionError("cannot find the length of the indexer")
Expand Down
54 changes: 48 additions & 6 deletions pandas/core/indexing.py
Original file line number Diff line number Diff line change
Expand Up @@ -1676,6 +1676,7 @@ def _setitem_with_indexer_split_path(self, indexer, value, name: str):
# Above we only set take_split_path to True for 2D cases
assert self.ndim == 2

orig = indexer
if not isinstance(indexer, tuple):
indexer = _tuplify(self.ndim, indexer)
if len(indexer) > self.ndim:
Expand All @@ -1689,8 +1690,20 @@ def _setitem_with_indexer_split_path(self, indexer, value, name: str):

info_idx = indexer[1]
pi = indexer[0]
if (
isinstance(pi, ABCDataFrame)
and orig is pi
and hasattr(self.obj._mgr, "blocks")
and len(self.obj._mgr.blocks) == 1
):
# FIXME: kludge
return self._setitem_single_block(orig, value, name)

if com.is_null_slice(info_idx) and is_scalar(value):
if (
com.is_null_slice(info_idx)
and is_scalar(value)
and not isinstance(pi, ABCDataFrame)
):
# We can go directly through BlockManager.setitem without worrying
# about alignment.
# TODO: do we need to do some kind of copy_with_setting check?
Expand Down Expand Up @@ -1734,7 +1747,8 @@ def _setitem_with_indexer_split_path(self, indexer, value, name: str):

elif len(ilocs) == 1 and lplane_indexer == len(value) and not is_scalar(pi):
# We are setting multiple rows in a single column.
self._setitem_single_column(ilocs[0], value, pi)
self._setitem_iat_loc(ilocs[0], pi, value)
# self._setitem_single_column(ilocs[0], value, pi)

elif len(ilocs) == 1 and 0 != lplane_indexer != len(value):
# We are trying to set N values into M entries of a single
Expand All @@ -1758,7 +1772,8 @@ def _setitem_with_indexer_split_path(self, indexer, value, name: str):
elif len(ilocs) == len(value):
# We are setting multiple columns in a single row.
for loc, v in zip(ilocs, value):
self._setitem_single_column(loc, v, pi)
self._setitem_iat_loc(loc, pi, v)
# self._setitem_single_column(loc, v, pi)

elif len(ilocs) == 1 and com.is_null_slice(pi) and len(self.obj) == 0:
# This is a setitem-with-expansion, see
Expand Down Expand Up @@ -1796,6 +1811,7 @@ def _setitem_with_indexer_2d_value(self, indexer, value):

for i, loc in enumerate(ilocs):
# setting with a list, re-coerces
# self._setitem_iat_loc(loc, pi, value[:, i].tolist())
self._setitem_single_column(loc, value[:, i].tolist(), pi)

def _setitem_with_indexer_frame_value(self, indexer, value: DataFrame, name: str):
Expand All @@ -1812,7 +1828,8 @@ def _setitem_with_indexer_frame_value(self, indexer, value: DataFrame, name: str
if name == "iloc":
for i, loc in enumerate(ilocs):
val = value.iloc[:, i]
self._setitem_single_column(loc, val, pi)
self._setitem_iat_loc(loc, pi, val)
# self._setitem_single_column(loc, val, pi)

elif not unique_cols and value.columns.equals(self.obj.columns):
# We assume we are already aligned, see
Expand All @@ -1829,7 +1846,8 @@ def _setitem_with_indexer_frame_value(self, indexer, value: DataFrame, name: str
else:
val = np.nan

self._setitem_single_column(loc, val, pi)
self._setitem_iat_loc(loc, pi, val)
# self._setitem_single_column(loc, val, pi)

elif not unique_cols:
raise ValueError("Setting with non-unique columns is not allowed.")
Expand All @@ -1848,7 +1866,8 @@ def _setitem_with_indexer_frame_value(self, indexer, value: DataFrame, name: str
else:
val = np.nan

self._setitem_single_column(loc, val, pi)
self._setitem_iat_loc(loc, pi, val)
# self._setitem_single_column(loc, val, pi)

def _setitem_single_column(self, loc: int, value, plane_indexer):
"""
Expand Down Expand Up @@ -1882,6 +1901,29 @@ def _setitem_single_column(self, loc: int, value, plane_indexer):
# reset the sliced object if unique
self.obj._iset_item(loc, ser)

def _setitem_iat_loc(self, loc: int, pi, value):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this method supposed to do? Can you add some docstring / comment?

# TODO: likely a BM method?
mgr = self.obj._mgr
blkno = mgr.blknos[loc]
blkloc = mgr.blklocs[loc]
blk = mgr.blocks[blkno]
assert blk.mgr_locs[blkloc] == loc

if blk._can_hold_element(value):
# NB: we are assuming here that _can_hold_element is accurate
# TODO: do we need to do some kind of copy_with_setting check?
try:
self.obj._check_is_chained_assignment_possible()
blk.setitem_inplace((pi, blkloc), value)
self.obj._maybe_update_cacher(clear=True)
except ValueError:
if blk.is_extension:
# FIXME: kludge bc _can_hold_element is wrong for EABLock
return self._setitem_single_column(loc, value, pi)
raise
else:
self._setitem_single_column(loc, value, pi)

def _setitem_single_block(self, indexer, value, name: str):
"""
_setitem_with_indexer for the case when we have a single Block.
Expand Down
7 changes: 0 additions & 7 deletions pandas/core/internals/blocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -1008,22 +1008,15 @@ def setitem(self, indexer, value):
values[indexer] = value

elif exact_match and is_categorical_dtype(arr_value.dtype):
# GH25495 - If the current dtype is not categorical,
# we need to create a new categorical block
values[indexer] = value

elif exact_match and is_ea_value:
# GH#32395 if we're going to replace the values entirely, just
# substitute in the new array
if not self.is_object and isinstance(value, (IntegerArray, FloatingArray)):
values[indexer] = value.to_numpy(value.dtype.numpy_dtype)
else:
values[indexer] = np.asarray(value)

# if we are an exact match (ex-broadcasting),
# then use the resultant dtype
elif exact_match:
# We are setting _all_ of the array's values, so can cast to new dtype
values[indexer] = value

elif is_ea_value:
Expand Down
1 change: 1 addition & 0 deletions pandas/core/internals/managers.py
Original file line number Diff line number Diff line change
Expand Up @@ -1464,6 +1464,7 @@ def take(self, indexer, axis: int = 1, verify: bool = True, convert: bool = True
"""
Take items along any axis.
"""
# TODO: should these be np.intp?
indexer = (
np.arange(indexer.start, indexer.stop, indexer.step, dtype="int64")
if isinstance(indexer, slice)
Expand Down
20 changes: 0 additions & 20 deletions pandas/tests/extension/test_numpy.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,26 +350,6 @@ def test_setitem_sequence_broadcasts(self, data, box_in_series):
# length than the value
super().test_setitem_sequence_broadcasts(data, box_in_series)

@skip_nested
def test_setitem_loc_scalar_mixed(self, data):
# AssertionError
super().test_setitem_loc_scalar_mixed(data)

@skip_nested
def test_setitem_loc_scalar_multiple_homogoneous(self, data):
# AssertionError
super().test_setitem_loc_scalar_multiple_homogoneous(data)

@skip_nested
def test_setitem_iloc_scalar_mixed(self, data):
# AssertionError
super().test_setitem_iloc_scalar_mixed(data)

@skip_nested
def test_setitem_iloc_scalar_multiple_homogoneous(self, data):
# AssertionError
super().test_setitem_iloc_scalar_multiple_homogoneous(data)

@skip_nested
@pytest.mark.parametrize("setter", ["loc", None])
def test_setitem_mask_broadcast(self, data, setter):
Expand Down
17 changes: 3 additions & 14 deletions pandas/tests/indexing/test_iloc.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,24 +74,14 @@ def test_iloc_setitem_fullcol_categorical(self, indexer, key):
orig_vals = df.values
indexer(df)[key, 0] = cat

overwrite = isinstance(key, slice) and key == slice(None)

if overwrite:
# TODO: GH#39986 this probably shouldn't behave differently
expected = DataFrame({0: cat})
assert not np.shares_memory(df.values, orig_vals)
else:
expected = DataFrame({0: cat}).astype(object)
assert np.shares_memory(df.values, orig_vals)
expected = DataFrame({0: cat.astype(object)})
assert np.shares_memory(df.values, orig_vals)

tm.assert_frame_equal(df, expected)

# check we dont have a view on cat (may be undesired GH#39986)
df.iloc[0, 0] = "gamma"
if overwrite:
assert cat[0] != "gamma"
else:
assert cat[0] != "gamma"
assert cat[0] != "gamma"

@pytest.mark.parametrize("box", [pd_array, Series])
def test_iloc_setitem_ea_inplace(self, frame_or_series, box):
Expand Down Expand Up @@ -824,7 +814,6 @@ def test_series_indexing_zerodim_np_array(self):
result = s.iloc[np.array(0)]
assert result == 1

@pytest.mark.xfail(reason="https://github.com/pandas-dev/pandas/issues/33457")
def test_iloc_setitem_categorical_updates_inplace(self):
# Mixed dtype ensures we go through take_split_path in setitem_with_indexer
cat = Categorical(["A", "B", "C"])
Expand Down
35 changes: 26 additions & 9 deletions pandas/tests/indexing/test_indexing.py
Original file line number Diff line number Diff line change
Expand Up @@ -529,13 +529,19 @@ def test_astype_assignment(self):
expected = DataFrame(
[[1, 2, "3", ".4", 5, 6.0, "foo"]], columns=list("ABCDEFG")
)
# original (object) array can hold new values, so setting is inplace
expected["A"] = expected["A"].astype(object)
expected["B"] = expected["B"].astype(object)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is an undesired change in behaviour .. (although consistent with the rules). It's rather clear that when doing df.iloc[:, 0:2] = df.iloc[:, 0:2].astype(np.int64) you want to change it to int64 ..

tm.assert_frame_equal(df, expected)

df = df_orig.copy()
df.iloc[:, 0:2] = df.iloc[:, 0:2]._convert(datetime=True, numeric=True)
expected = DataFrame(
[[1, 2, "3", ".4", 5, 6.0, "foo"]], columns=list("ABCDEFG")
)
# original (object) array can hold new values, so setting is inplace
expected["A"] = expected["A"].astype(object)
expected["B"] = expected["B"].astype(object)
tm.assert_frame_equal(df, expected)

# GH5702 (loc)
Expand All @@ -544,26 +550,37 @@ def test_astype_assignment(self):
expected = DataFrame(
[[1, "2", "3", ".4", 5, 6.0, "foo"]], columns=list("ABCDEFG")
)
# df["A"] can hold the RHS, so the assignment is inplace, remains object
expected["A"] = expected["A"].astype(object)
tm.assert_frame_equal(df, expected)

df = df_orig.copy()
df.loc[:, ["B", "C"]] = df.loc[:, ["B", "C"]].astype(np.int64)
expected = DataFrame(
[["1", 2, 3, ".4", 5, 6.0, "foo"]], columns=list("ABCDEFG")
)
# original (object) array can hold new values, so setting is inplace
expected["B"] = expected["B"].astype(object)
expected["C"] = expected["C"].astype(object)
tm.assert_frame_equal(df, expected)

def test_astype_assignment_full_replacements(self):
# full replacements / no nans
df = DataFrame({"A": [1.0, 2.0, 3.0, 4.0]})
df.iloc[:, 0] = df["A"].astype(np.int64)
expected = DataFrame({"A": [1, 2, 3, 4]})
tm.assert_frame_equal(df, expected)

df = DataFrame({"A": [1.0, 2.0, 3.0, 4.0]})
df.loc[:, "A"] = df["A"].astype(np.int64)
expected = DataFrame({"A": [1, 2, 3, 4]})
tm.assert_frame_equal(df, expected)
# the new values can all be held by the existing array, so the assignment
# is in-place
orig = DataFrame({"A": [1.0, 2.0, 3.0, 4.0]})
value = orig.astype(np.int64)
# expected = DataFrame({"A": [1, 2, 3, 4]})

df = orig.copy()
df.iloc[
:, 0
] = value # <- not yet, bc value is a DataFrame; would work with value["A"]
tm.assert_frame_equal(df, orig)

df = orig.copy()
df.loc[:, "A"] = value
tm.assert_frame_equal(df, orig)

@pytest.mark.parametrize("indexer", [tm.getitem, tm.loc])
def test_index_type_coercion(self, indexer):
Expand Down
4 changes: 3 additions & 1 deletion pandas/tests/indexing/test_loc.py
Original file line number Diff line number Diff line change
Expand Up @@ -781,6 +781,7 @@ def test_loc_coercion(self):
result = df.iloc[[1]]
tm.assert_series_equal(result.dtypes, expected)

def test_loc_coercion2(self):
# 12045
import datetime

Expand All @@ -795,6 +796,7 @@ def test_loc_coercion(self):
result = df.iloc[[1]]
tm.assert_series_equal(result.dtypes, expected)

def test_loc_coercion3(self):
# 11594
df = DataFrame({"text": ["some words"] + [None] * 9})
expected = df.dtypes
Expand Down Expand Up @@ -1208,7 +1210,7 @@ def test_loc_setitem_single_row_categorical(self):
df.loc[:, "Alpha"] = categories

result = df["Alpha"]
expected = Series(categories, index=df.index, name="Alpha")
expected = Series(categories, index=df.index, name="Alpha").astype(object)
tm.assert_series_equal(result, expected)

def test_loc_setitem_datetime_coercion(self):
Expand Down
4 changes: 3 additions & 1 deletion pandas/tests/indexing/test_partial.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ def test_partial_setting(self):
tm.assert_frame_equal(df, expected)

# mixed dtype frame, overwrite
expected = DataFrame(dict({"A": [0, 2, 4], "B": Series([0, 2, 4])}))
# float64 can hold df.loc[:, "A"], so setting is inplace
expected = DataFrame(dict({"A": [0, 2, 4], "B": Series([0.0, 2.0, 4.0])}))
df = df_orig.copy()
df["B"] = df["B"].astype(np.float64)
df.loc[:, "B"] = df.loc[:, "A"]
Expand All @@ -120,6 +121,7 @@ def test_partial_setting(self):
df.loc[:, "C"] = df.loc[:, "A"]
tm.assert_frame_equal(df, expected)

def test_partial_setting2(self):
# GH 8473
dates = date_range("1/1/2000", periods=8)
df_orig = DataFrame(
Expand Down