Skip to content

Commit ac05bd7

Browse files
committed
ENH: implemented BlockManager.take for axis >=1 and seriously sped up DataFrame.take
1 parent 118f571 commit ac05bd7

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed

pandas/core/frame.py

+15-12
Original file line numberDiff line numberDiff line change
@@ -1090,19 +1090,22 @@ def take(self, indices, axis=0):
10901090
-------
10911091
taken : DataFrame
10921092
"""
1093-
if axis == 0:
1094-
new_index = self.index.take(indices)
1095-
new_columns = self.columns
1096-
else:
1097-
new_index = self.index
1098-
new_columns = self.columns.take(indices)
1099-
1100-
# TODO: implement take on BlockManager
11011093
if self._data.is_mixed_dtype():
1102-
return self.reindex(index=new_index, columns=new_columns)
1103-
1104-
new_values = self.values.take(indices, axis=axis)
1105-
return DataFrame(new_values, index=new_index, columns=new_columns)
1094+
if axis == 0:
1095+
new_data = self._data.take(indices, axis=1)
1096+
return DataFrame(new_data)
1097+
else:
1098+
return self.reindex(columns=new_columns)
1099+
else:
1100+
new_values = self.values.take(indices, axis=axis)
1101+
if axis == 0:
1102+
new_columns = self.columns
1103+
new_index = self.index.take(indices)
1104+
else:
1105+
new_columns = self.columns.take(indices)
1106+
new_index = self.index
1107+
return DataFrame(new_values, index=new_index,
1108+
columns=new_columns)
11061109

11071110
#----------------------------------------------------------------------
11081111
# Reindex-based selection methods

pandas/core/internals.py

+14
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,20 @@ def reindex_items(self, new_items):
598598

599599
return BlockManager(new_blocks, new_axes)
600600

601+
def take(self, indices, axis=1):
602+
if axis == 0:
603+
raise NotImplementedError
604+
605+
new_axes = list(self.axes)
606+
new_axes[axis] = self.axes[axis].take(indices)
607+
new_blocks = []
608+
for blk in self.blocks:
609+
newb = make_block(blk.values.take(indices, axis=axis), blk.items,
610+
self.items)
611+
new_blocks.append(newb)
612+
613+
return BlockManager(new_blocks, new_axes)
614+
601615
def merge(self, other, lsuffix=None, rsuffix=None):
602616
assert(self._is_indexed_like(other))
603617

pandas/tests/test_tseries.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def test_inner_join_indexer():
7676
a = np.array([1, 2, 3, 4, 5], dtype=np.int64)
7777
b = np.array([0, 3, 5, 7, 9], dtype=np.int64)
7878

79-
index, ares, bres = lib.inner_join_indexer(a, b)
79+
index, ares, bres = lib.inner_join_indexer_int64(a, b)
8080

8181
index_exp = np.array([3, 5], dtype=np.int64)
8282
assert_almost_equal(index, index_exp)
@@ -90,7 +90,7 @@ def test_outer_join_indexer():
9090
a = np.array([1, 2, 3, 4, 5], dtype=np.int64)
9191
b = np.array([0, 3, 5, 7, 9], dtype=np.int64)
9292

93-
index, ares, bres = lib.outer_join_indexer(a, b)
93+
index, ares, bres = lib.outer_join_indexer_int64(a, b)
9494

9595
index_exp = np.array([0, 1, 2, 3, 4, 5, 7, 9], dtype=np.int64)
9696
assert_almost_equal(index, index_exp)

0 commit comments

Comments
 (0)