Skip to content

Commit d9ea01f

Browse files
committed
BUG: allow casting DataFrame float column to int, GH #252
1 parent 7f3e3b4 commit d9ea01f

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

pandas/core/internals.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,21 +171,35 @@ def fillna(self, value):
171171

172172
class FloatBlock(Block):
173173

174+
def should_store(self, value):
175+
# when inserting a column should not coerce integers to floats
176+
# unnecessarily
177+
return issubclass(value.dtype.type, np.floating)
178+
174179
def can_store(self, value):
175180
return issubclass(value.dtype.type, (np.integer, np.floating))
176181

177182
class IntBlock(Block):
178183

184+
def should_store(self, value):
185+
return self.can_store(value)
186+
179187
def can_store(self, value):
180188
return issubclass(value.dtype.type, np.integer)
181189

182190
class BoolBlock(Block):
183191

192+
def should_store(self, value):
193+
return self.can_store(value)
194+
184195
def can_store(self, value):
185196
return issubclass(value.dtype.type, np.bool_)
186197

187198
class ObjectBlock(Block):
188199

200+
def should_store(self, value):
201+
return self.can_store(value)
202+
189203
def can_store(self, value):
190204
return not issubclass(value.dtype.type,
191205
(np.integer, np.floating, np.bool_))
@@ -534,7 +548,7 @@ def set(self, item, value):
534548
assert(value.shape[1:] == self.shape[1:])
535549
if item in self.items:
536550
i, block = self._find_block(item)
537-
if not block.can_store(value):
551+
if not block.should_store(value):
538552
# delete from block, create and append new block
539553
self._delete_from_block(i, item)
540554
self._add_new_block(item, value)

pandas/tests/test_frame.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ def test_setitem_boolean(self):
160160
np.putmask(expected.values, mask.values, df.values * 2)
161161
assert_frame_equal(df, expected)
162162

163+
def test_setitem_cast(self):
164+
self.frame['D'] = self.frame['D'].astype('i8')
165+
self.assert_(self.frame['D'].dtype == np.int64)
166+
163167
def test_setitem_boolean_column(self):
164168
expected = self.frame.copy()
165169
mask = self.frame['A'] > 0
@@ -284,8 +288,8 @@ def test_setitem_fancy_2d(self):
284288
frame = self.frame.copy()
285289
expected = frame.copy()
286290
frame.ix[:, ['B', 'A']] = 1
287-
expected['B'] = 1
288-
expected['A'] = 1
291+
expected['B'] = 1.
292+
expected['A'] = 1.
289293
assert_frame_equal(frame, expected)
290294

291295
# case 2
@@ -370,7 +374,7 @@ def test_fancy_getitem_slice_mixed(self):
370374

371375
# get view with single block
372376
sliced = self.frame.ix[:, -3:]
373-
sliced['C'] = 4
377+
sliced['C'] = 4.
374378
self.assert_((self.frame['C'] == 4).all())
375379

376380
def test_fancy_setitem_int_labels(self):

0 commit comments

Comments
 (0)