Skip to content

Commit 2bd4c00

Browse files
committed
BUG: out buffer for ndarray methods needs to be same dtype, GH #486
1 parent 2a4d409 commit 2bd4c00

File tree

4 files changed

+16
-1
lines changed

4 files changed

+16
-1
lines changed

pandas/core/common.py

+4
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,10 @@ def take_2d(arr, indexer, out=None, mask=None, needs_masking=None, axis=0):
231231
mask = indexer == -1
232232
needs_masking = mask.any()
233233

234+
# GH #486
235+
if out is not None and arr.dtype != out.dtype:
236+
arr = arr.astype(out.dtype)
237+
234238
result = arr.take(indexer, axis=axis, out=out)
235239
result = _maybe_mask(result, mask, needs_masking, axis=axis,
236240
out_passed=out is not None)

pandas/core/internals.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ def reindex_items_from(self, new_ref_items):
132132
masked_idx = indexer[mask]
133133

134134
if self.values.ndim == 2:
135-
new_values = com.take_2d(self.values, masked_idx, axis=0)
135+
new_values = com.take_2d(self.values, masked_idx, axis=0,
136+
needs_masking=False)
136137
else:
137138
new_values = self.values.take(masked_idx, axis=0)
138139

pandas/tests/test_common.py

+4
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,10 @@ def test_2d_float32(self):
253253
expected[[2, 4]] = np.nan
254254
tm.assert_almost_equal(result, expected)
255255

256+
# test with float64 out buffer
257+
out = np.empty((len(indexer), arr.shape[1]), dtype='f8')
258+
common.take_2d(arr, indexer, out=out) # it works!
259+
256260
# axis=1
257261
result = common.take_2d(arr, indexer, axis=1)
258262
result2 = np.empty_like(result)

pandas/tests/test_frame.py

+6
Original file line numberDiff line numberDiff line change
@@ -4139,6 +4139,12 @@ def test_join_multiindex(self):
41394139
assert_frame_equal(joined, expected)
41404140
self.assertEqual(joined.index.names, index1.names)
41414141

4142+
def test_join_float64_float32(self):
4143+
a = DataFrame(randn(10,2), columns=['a','b'])
4144+
b = DataFrame(randn(10,1), columns=['c']).astype(np.float32)
4145+
joined = a.join(b)
4146+
expected = a.join(b.astype('f8'))
4147+
assert_frame_equal(joined, expected)
41424148

41434149
def _join_by_hand(a, b, how='left'):
41444150
join_index = a.index.join(b.index, how=how)

0 commit comments

Comments
 (0)