Skip to content

Commit 1a0eb84

Browse files
committed
Merge pull request pandas-dev#5939 from jreback/chained
API: Raise/Warn SettingWithCopyError in more cases
2 parents b12de52 + 3749e9a commit 1a0eb84

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

doc/source/release.rst

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ API Changes
5858

5959
- ``Series.sort`` will raise a ``ValueError`` (rather than a ``TypeError``) on sorting an
6060
object that is a view of another (:issue:`5856`, :issue:`5853`)
61-
62-
.. _release.bug_fixes-0.13.1:
61+
- Raise/Warn ``SettingWithCopyError`` (according to the option ``chained_assignment`` in more cases,
62+
when detecting chained assignment, related (:issue:`5938`)
63+
- DataFrame.head(0) returns self instead of empty frame (:issue:`5846`)
6364

6465
Experimental Features
6566
~~~~~~~~~~~~~~~~~~~~~
@@ -72,7 +73,8 @@ Improvements to existing features
7273
- df.info() view now display dtype info per column (:issue: `5682`)
7374
- perf improvements in DataFrame ``count/dropna`` for ``axis=1``
7475
- Series.str.contains now has a `regex=False` keyword which can be faster for plain (non-regex) string patterns. (:issue: `5879`)
75-
- DataFrame.head(0) returns self instead of empty frame (:issue:`5846`)
76+
77+
.. _release.bug_fixes-0.13.1:
7678

7779
Bug Fixes
7880
~~~~~~~~~

pandas/core/frame.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1856,6 +1856,7 @@ def _box_col_values(self, values, items):
18561856
name=items, fastpath=True)
18571857

18581858
def __setitem__(self, key, value):
1859+
18591860
# see if we can slice the rows
18601861
indexer = _convert_to_index_sliceable(self, key)
18611862
if indexer is not None:
@@ -1880,6 +1881,7 @@ def _setitem_array(self, key, value):
18801881
(len(key), len(self.index)))
18811882
key = _check_bool_indexer(self.index, key)
18821883
indexer = key.nonzero()[0]
1884+
self._check_setitem_copy()
18831885
self.ix._setitem_with_indexer(indexer, value)
18841886
else:
18851887
if isinstance(value, DataFrame):
@@ -1889,6 +1891,7 @@ def _setitem_array(self, key, value):
18891891
self[k1] = value[k2]
18901892
else:
18911893
indexer = self.ix._convert_to_indexer(key, axis=1)
1894+
self._check_setitem_copy()
18921895
self.ix._setitem_with_indexer((slice(None), indexer), value)
18931896

18941897
def _setitem_frame(self, key, value):

pandas/tests/test_indexing.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,6 +2061,14 @@ def f():
20612061
assert_series_equal(s,df.iloc[:,0].order())
20622062
assert_series_equal(s,df[0].order())
20632063

2064+
# operating on a copy
2065+
df = pd.DataFrame({'a': list(range(4)), 'b': list('ab..'), 'c': ['a', 'b', np.nan, 'd']})
2066+
mask = pd.isnull(df.c)
2067+
2068+
def f():
2069+
df[['c']][mask] = df[['b']][mask]
2070+
self.assertRaises(com.SettingWithCopyError, f)
2071+
20642072
pd.set_option('chained_assignment','warn')
20652073

20662074
def test_float64index_slicing_bug(self):

0 commit comments

Comments
 (0)