@@ -59,7 +59,7 @@ def _single_replace(self, to_replace, method, inplace, limit):
5959 dtype = self .dtype ).__finalize__ (self )
6060
6161 if inplace :
62- self ._data = result ._data
62+ self ._update_inplace ( result ._data )
6363 return
6464
6565 return result
@@ -562,9 +562,7 @@ def f(x):
562562 result ._clear_item_cache ()
563563
564564 if inplace :
565- self ._data = result ._data
566- self ._clear_item_cache ()
567-
565+ self ._update_inplace (result ._data )
568566 else :
569567 return result .__finalize__ (self )
570568
@@ -994,12 +992,22 @@ def _maybe_update_cacher(self, clear=False):
994992 if clear, then clear our cache """
995993 cacher = getattr (self , '_cacher' , None )
996994 if cacher is not None :
997- try :
998- cacher [1 ]()._maybe_cache_changed (cacher [0 ], self )
999- except :
995+ ref = cacher [1 ]()
1000996
1001- # our referant is dead
997+ # we are trying to reference a dead referant, hence
998+ # a copy
999+ if ref is None :
10021000 del self ._cacher
1001+ self .is_copy = True
1002+ self ._check_setitem_copy (stacklevel = 5 , t = 'referant' )
1003+ else :
1004+ try :
1005+ ref ._maybe_cache_changed (cacher [0 ], self )
1006+ except :
1007+ pass
1008+ if ref .is_copy :
1009+ self .is_copy = True
1010+ self ._check_setitem_copy (stacklevel = 5 , t = 'referant' )
10031011
10041012 if clear :
10051013 self ._clear_item_cache ()
@@ -1014,22 +1022,21 @@ def _set_item(self, key, value):
10141022 self ._data .set (key , value )
10151023 self ._clear_item_cache ()
10161024
1017- def _setitem_copy (self , copy ):
1018- """ set the _is_copy of the iiem """
1019- self .is_copy = copy
1020- return self
1021-
1022- def _check_setitem_copy (self , stacklevel = 4 ):
1025+ def _check_setitem_copy (self , stacklevel = 4 , t = 'setting' ):
10231026 """ validate if we are doing a settitem on a chained copy.
10241027
10251028 If you call this function, be sure to set the stacklevel such that the
10261029 user will see the error *at the level of setting*"""
10271030 if self .is_copy :
10281031 value = config .get_option ('mode.chained_assignment' )
10291032
1030- t = ("A value is trying to be set on a copy of a slice from a "
1031- "DataFrame.\n Try using .loc[row_index,col_indexer] = value "
1032- "instead" )
1033+ if t == 'referant' :
1034+ t = ("A value is trying to be set on a copy of a slice from a "
1035+ "DataFrame" )
1036+ else :
1037+ t = ("A value is trying to be set on a copy of a slice from a "
1038+ "DataFrame.\n Try using .loc[row_index,col_indexer] = value "
1039+ "instead" )
10331040 if value == 'raise' :
10341041 raise SettingWithCopyError (t )
10351042 elif value == 'warn' :
@@ -1103,7 +1110,7 @@ def take(self, indices, axis=0, convert=True, is_copy=True):
11031110
11041111 # maybe set copy if we didn't actually change the index
11051112 if is_copy and not result ._get_axis (axis ).equals (self ._get_axis (axis )):
1106- result = result . _setitem_copy ( is_copy )
1113+ result . is_copy = is_copy
11071114
11081115 return result
11091116
@@ -1218,7 +1225,7 @@ def _update_inplace(self, result):
12181225 # decision that we may revisit in the future.
12191226 self ._reset_cache ()
12201227 self ._clear_item_cache ()
1221- self ._data = result . _data
1228+ self ._data = getattr ( result , ' _data' , result )
12221229 self ._maybe_update_cacher ()
12231230
12241231 def add_prefix (self , prefix ):
@@ -1910,14 +1917,13 @@ def fillna(self, value=None, method=None, axis=0, inplace=False,
19101917 continue
19111918 obj = result [k ]
19121919 obj .fillna (v , inplace = True )
1913- obj ._maybe_update_cacher ()
19141920 return result
19151921 else :
19161922 new_data = self ._data .fillna (value , inplace = inplace ,
19171923 downcast = downcast )
19181924
19191925 if inplace :
1920- self ._data = new_data
1926+ self ._update_inplace ( new_data )
19211927 else :
19221928 return self ._constructor (new_data ).__finalize__ (self )
19231929
@@ -2165,7 +2171,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None,
21652171 new_data = new_data .convert (copy = not inplace , convert_numeric = False )
21662172
21672173 if inplace :
2168- self ._data = new_data
2174+ self ._update_inplace ( new_data )
21692175 else :
21702176 return self ._constructor (new_data ).__finalize__ (self )
21712177
@@ -2272,10 +2278,10 @@ def interpolate(self, method='linear', axis=0, limit=None, inplace=False,
22722278
22732279 if inplace :
22742280 if axis == 1 :
2275- self ._data = new_data
2281+ self ._update_inplace ( new_data )
22762282 self = self .T
22772283 else :
2278- self ._data = new_data
2284+ self ._update_inplace ( new_data )
22792285 else :
22802286 res = self ._constructor (new_data ).__finalize__ (self )
22812287 if axis == 1 :
@@ -2856,8 +2862,9 @@ def where(self, cond, other=np.nan, inplace=False, axis=None, level=None,
28562862 if inplace :
28572863 # we may have different type blocks come out of putmask, so
28582864 # reconstruct the block manager
2859- self ._data = self ._data .putmask (cond , other , align = axis is None ,
2860- inplace = True )
2865+ new_data = self ._data .putmask (cond , other , align = axis is None ,
2866+ inplace = True )
2867+ self ._update_inplace (new_data )
28612868
28622869 else :
28632870 new_data = self ._data .where (other , cond , align = axis is None ,
0 commit comments