|
3 | 3 | from pandas import compat
|
4 | 4 | import itertools
|
5 | 5 | import operator
|
| 6 | +import weakref |
6 | 7 | import numpy as np
|
7 | 8 | import pandas.lib as lib
|
8 | 9 | from pandas.core.base import PandasObject
|
@@ -702,11 +703,23 @@ def _get_item_cache(self, item):
|
702 | 703 | values = self._data.get(item)
|
703 | 704 | res = self._box_item_values(item, values)
|
704 | 705 | cache[item] = res
|
| 706 | + res._cacher = (item,weakref.ref(self)) |
705 | 707 | return res
|
706 | 708 |
|
707 | 709 | def _box_item_values(self, key, values):
|
708 | 710 | raise NotImplementedError
|
709 | 711 |
|
| 712 | + def _maybe_cache_changed(self, item, value): |
| 713 | + """ the object has called back to us saying |
| 714 | + maybe it has changed """ |
| 715 | + self._data.set(item, value) |
| 716 | + |
| 717 | + def _maybe_update_cacher(self): |
| 718 | + """ see if we need to update our parent cacher """ |
| 719 | + cacher = getattr(self,'_cacher',None) |
| 720 | + if cacher is not None: |
| 721 | + cacher[1]()._maybe_cache_changed(cacher[0],self) |
| 722 | + |
710 | 723 | def _clear_item_cache(self):
|
711 | 724 | self._item_cache.clear()
|
712 | 725 |
|
@@ -1437,7 +1450,9 @@ def fillna(self, value=None, method=None, axis=0, inplace=False,
|
1437 | 1450 | for k, v in value.iteritems():
|
1438 | 1451 | if k not in result:
|
1439 | 1452 | continue
|
1440 |
| - result[k].fillna(v, inplace=True) |
| 1453 | + obj = result[k] |
| 1454 | + obj.fillna(v, inplace=True) |
| 1455 | + obj._maybe_update_cacher() |
1441 | 1456 | return result
|
1442 | 1457 | else:
|
1443 | 1458 | new_data = self._data.fillna(value, inplace=inplace,
|
|
0 commit comments