Skip to content

Commit 6841148

Browse files
committed
ENH: add DataFrame.get_value/put_value and micro-performance tweaks, GH #360 and #361 complete
1 parent d38b36e commit 6841148

File tree

3 files changed

+36
-17
lines changed

3 files changed

+36
-17
lines changed

pandas/core/frame.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ def __array_wrap__(self, result):
867867
#----------------------------------------------------------------------
868868
# Getting and setting elements
869869

870-
def get(self, index, col):
870+
def get_value(self, index, col):
871871
"""
872872
Retrieve single value at passed column and index
873873
@@ -880,7 +880,23 @@ def get(self, index, col):
880880
-------
881881
element : scalar value
882882
"""
883-
return self._data.get_scalar((col, index))
883+
iloc = self.index.get_loc(index)
884+
vals = self._getitem_single(col).values
885+
return vals[iloc]
886+
887+
def put_value(self, index, col, value):
888+
"""
889+
Put single value at passed column and index
890+
891+
Parameters
892+
----------
893+
index : row label
894+
col : column label
895+
value : scalar value
896+
"""
897+
iloc = self.index.get_loc(index)
898+
vals = self._getitem_single(col).values
899+
vals[iloc] = value
884900

885901
def __getitem__(self, key):
886902
# slice rows
@@ -942,15 +958,15 @@ def _getitem_multilevel(self, key):
942958
return self._getitem_single(key)
943959

944960
def _getitem_single(self, key):
945-
res = self._series_cache.get(key)
946-
if res is not None:
961+
cache = self._series_cache
962+
try:
963+
return cache[key]
964+
except:
965+
values = self._data.get(key)
966+
res = Series(values, index=self.index, name=key)
967+
cache[key] = res
947968
return res
948969

949-
values = self._data.get(key)
950-
res = Series(values, index=self.index, name=key)
951-
self._series_cache[key] = res
952-
return res
953-
954970
def __getattr__(self, name):
955971
"""After regular attribute access, try looking up the name of a column.
956972
This allows simpler access to columns for interactive use."""

pandas/core/index.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,10 +1485,7 @@ def union(self, other):
14851485

14861486
result_names = self.names if self.names == other.names else None
14871487

1488-
self_tuples = self.get_tuple_index()
1489-
other_tuples = other.get_tuple_index()
1490-
1491-
uniq_tuples = lib.fast_unique_multiple([self_tuples, other_tuples])
1488+
uniq_tuples = lib.fast_unique_multiple([self.values, other.values])
14921489
return MultiIndex.from_arrays(zip(*uniq_tuples), sortorder=0,
14931490
names=result_names)
14941491

@@ -1511,8 +1508,8 @@ def intersection(self, other):
15111508

15121509
result_names = self.names if self.names == other.names else None
15131510

1514-
self_tuples = self.get_tuple_index()
1515-
other_tuples = other.get_tuple_index()
1511+
self_tuples = self.values
1512+
other_tuples = other.values
15161513
uniq_tuples = sorted(set(self_tuples) & set(other_tuples))
15171514
if len(uniq_tuples) == 0:
15181515
return MultiIndex(levels=[[]]*self.nlevels,

pandas/tests/test_frame.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -660,13 +660,19 @@ def test_getitem_boolean_missing(self):
660660
def test_setitem_boolean_missing(self):
661661
pass
662662

663-
def test_get_scalar(self):
663+
def test_get_value(self):
664664
for idx in self.frame.index:
665665
for col in self.frame.columns:
666-
result = self.frame.get(idx, col)
666+
result = self.frame.get_value(idx, col)
667667
expected = self.frame[col][idx]
668668
self.assertEqual(result, expected)
669669

670+
def test_put_value(self):
671+
for idx in self.frame.index:
672+
for col in self.frame.columns:
673+
self.frame.put_value(idx, col, 1)
674+
self.assertEqual(self.frame[col][idx], 1)
675+
670676
_seriesd = tm.getSeriesData()
671677
_tsd = tm.getTimeSeriesData()
672678

0 commit comments

Comments
 (0)