26
26
from pandas .compat import range , lrange , lmap , callable , map , zip , u
27
27
from pandas .tseries .timedeltas import _coerce_scalar_to_timedelta_type
28
28
29
-
30
29
class Block (PandasObject ):
31
30
32
31
"""
@@ -279,7 +278,7 @@ def get(self, item):
279
278
def iget (self , i ):
280
279
return self .values [i ]
281
280
282
- def set (self , item , value ):
281
+ def set (self , item , value , check = False ):
283
282
"""
284
283
Modify Block in-place with new item value
285
284
@@ -1360,6 +1359,26 @@ def convert(self, convert_dates=True, convert_numeric=True, convert_timedeltas=T
1360
1359
1361
1360
return blocks
1362
1361
1362
+ def set (self , item , value , check = False ):
1363
+ """
1364
+ Modify Block in-place with new item value
1365
+
1366
+ Returns
1367
+ -------
1368
+ None
1369
+ """
1370
+
1371
+ loc = self .items .get_loc (item )
1372
+
1373
+ # GH6026
1374
+ if check :
1375
+ try :
1376
+ if (self .values [loc ] == value ).all ():
1377
+ return
1378
+ except :
1379
+ pass
1380
+ self .values [loc ] = value
1381
+
1363
1382
def _maybe_downcast (self , blocks , downcast = None ):
1364
1383
1365
1384
if downcast is not None :
@@ -1601,7 +1620,7 @@ def astype(self, dtype, copy=False, raise_on_error=True):
1601
1620
return self ._astype (dtype , copy = copy , raise_on_error = raise_on_error ,
1602
1621
klass = klass )
1603
1622
1604
- def set (self , item , value ):
1623
+ def set (self , item , value , check = False ):
1605
1624
"""
1606
1625
Modify Block in-place with new item value
1607
1626
@@ -1714,7 +1733,7 @@ def prepare_for_merge(self, **kwargs):
1714
1733
def post_merge (self , items , ** kwargs ):
1715
1734
return self
1716
1735
1717
- def set (self , item , value ):
1736
+ def set (self , item , value , check = False ):
1718
1737
self .values = value
1719
1738
1720
1739
def get (self , item ):
@@ -2879,10 +2898,11 @@ def delete(self, item):
2879
2898
if not is_unique :
2880
2899
self ._consolidate_inplace ()
2881
2900
2882
- def set (self , item , value ):
2901
+ def set (self , item , value , check = False ):
2883
2902
"""
2884
2903
Set new item in-place. Does not consolidate. Adds new Block if not
2885
2904
contained in the current set of items
2905
+ if check, then validate that we are not setting the same data in-place
2886
2906
"""
2887
2907
if not isinstance (value , SparseArray ):
2888
2908
if value .ndim == self .ndim - 1 :
@@ -2898,7 +2918,7 @@ def _set_item(item, arr):
2898
2918
self ._delete_from_block (i , item )
2899
2919
self ._add_new_block (item , arr , loc = None )
2900
2920
else :
2901
- block .set (item , arr )
2921
+ block .set (item , arr , check = check )
2902
2922
2903
2923
try :
2904
2924
0 commit comments