@@ -163,6 +163,7 @@ def __init__(self, data=None, index=None, columns=None, dtype=None,
163
163
raise PandasError ('DataFrame constructor not properly called!' )
164
164
165
165
self ._data = mgr
166
+ self ._series_cache = {}
166
167
167
168
def _init_dict (self , data , index , columns , dtype = None ):
168
169
"""
@@ -613,8 +614,15 @@ def _get_dtype_counts(self):
613
614
#----------------------------------------------------------------------
614
615
# properties for index and columns
615
616
617
+ def _get_columns (self ):
618
+ return self ._data .axes [0 ]
619
+
620
+ def _set_columns (self , value ):
621
+ self ._data .set_axis (0 , value )
622
+ self ._series_cache .clear ()
623
+ columns = property (fset = _set_columns , fget = _get_columns )
624
+
616
625
# reference underlying BlockManager
617
- columns = AxisProperty (0 )
618
626
index = AxisProperty (1 )
619
627
620
628
def as_matrix (self , columns = None ):
@@ -653,6 +661,7 @@ def __setstate__(self, state):
653
661
else : # pragma: no cover
654
662
# old pickling format, for compatibility
655
663
self ._unpickle_matrix_compat (state )
664
+ self ._series_cache = {}
656
665
657
666
def _unpickle_frame_compat (self , state ): # pragma: no cover
658
667
from pandas .core .common import _unpickle_array
@@ -770,8 +779,14 @@ def _getitem_multilevel(self, key):
770
779
return self ._getitem_single (key )
771
780
772
781
def _getitem_single (self , key ):
782
+ res = self ._series_cache .get (key )
783
+ if res is not None :
784
+ return res
785
+
773
786
values = self ._data .get (key )
774
- return Series (values , index = self .index )
787
+ res = Series (values , index = self .index )
788
+ self ._series_cache [key ] = res
789
+ return res
775
790
776
791
def __setitem__ (self , key , value ):
777
792
"""
@@ -834,6 +849,11 @@ def _set_item(self, key, value):
834
849
value = np .atleast_2d (value ) # is this a hack?
835
850
self ._data .set (key , value )
836
851
852
+ try :
853
+ del self ._series_cache [key ]
854
+ except KeyError :
855
+ pass
856
+
837
857
def _sanitize_column (self , value ):
838
858
# Need to make sure new columns (which go into the BlockManager as new
839
859
# blocks) are always copied
@@ -864,6 +884,11 @@ def __delitem__(self, key):
864
884
"""
865
885
self ._data .delete (key )
866
886
887
+ try :
888
+ del self ._series_cache [key ]
889
+ except KeyError :
890
+ pass
891
+
867
892
def pop (self , item ):
868
893
"""
869
894
Return column and drop from frame. Raise KeyError if not
@@ -1219,9 +1244,11 @@ def rename(self, index=None, columns=None):
1219
1244
1220
1245
def _rename_index_inplace (self , mapper ):
1221
1246
self ._data = self ._data .rename_axis (mapper , axis = 1 )
1247
+ self ._series_cache .clear ()
1222
1248
1223
1249
def _rename_columns_inplace (self , mapper ):
1224
1250
self ._data = self ._data .rename_items (mapper )
1251
+ self ._series_cache .clear ()
1225
1252
1226
1253
#----------------------------------------------------------------------
1227
1254
# Arithmetic / combination related
0 commit comments