Skip to content

Commit 63a1239

Browse files
committed
BUG: don't type-cast when setting integer into existing DataFrame float column. special case for now, GH #669
1 parent d78e626 commit 63a1239

File tree

2 files changed

+34
-7
lines changed

2 files changed

+34
-7
lines changed

pandas/core/frame.py

+11-7
Original file line numberDiff line numberDiff line change
@@ -1426,8 +1426,7 @@ def _set_item(self, key, value):
14261426
Series/TimeSeries will be conformed to the DataFrame's index to
14271427
ensure homogeneity.
14281428
"""
1429-
value = self._sanitize_column(value)
1430-
value = np.atleast_2d(value)
1429+
value = self._sanitize_column(key, value)
14311430
NDFrame._set_item(self, key, value)
14321431

14331432
def insert(self, loc, column, value):
@@ -1442,11 +1441,10 @@ def insert(self, loc, column, value):
14421441
column : object
14431442
value : int, Series, or array-like
14441443
"""
1445-
value = self._sanitize_column(value)
1446-
value = np.atleast_2d(value)
1444+
value = self._sanitize_column(column, value)
14471445
self._data.insert(loc, column, value)
14481446

1449-
def _sanitize_column(self, value):
1447+
def _sanitize_column(self, key, value):
14501448
# Need to make sure new columns (which go into the BlockManager as new
14511449
# blocks) are always copied
14521450
if _is_sequence(value):
@@ -1465,8 +1463,14 @@ def _sanitize_column(self, value):
14651463
value = value.copy()
14661464
else:
14671465
value = np.repeat(value, len(self.index))
1468-
1469-
return np.asarray(value)
1466+
if key in self.columns:
1467+
existing_column = self[key]
1468+
# special case for now
1469+
if (com.is_float_dtype(existing_column) and
1470+
com.is_integer_dtype(value)):
1471+
value = value.astype(np.float64)
1472+
1473+
return np.atleast_2d(np.asarray(value))
14701474

14711475
def pop(self, item):
14721476
"""

pandas/tests/test_frame.py

+23
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,29 @@ def test_setitem_cast(self):
222222
self.frame['D'] = self.frame['D'].astype('i8')
223223
self.assert_(self.frame['D'].dtype == np.int64)
224224

225+
# #669, should not cast?
226+
self.frame['B'] = 0
227+
self.assert_(self.frame['B'].dtype == np.float64)
228+
229+
# cast if pass array of course
230+
self.frame['B'] = np.arange(len(self.frame))
231+
self.assert_(issubclass(self.frame['B'].dtype.type, np.integer))
232+
233+
self.frame['foo'] = 'bar'
234+
self.frame['foo'] = 0
235+
self.assert_(self.frame['foo'].dtype == np.int64)
236+
237+
self.frame['foo'] = 'bar'
238+
self.frame['foo'] = 2.5
239+
self.assert_(self.frame['foo'].dtype == np.float64)
240+
241+
self.frame['something'] = 0
242+
self.assert_(self.frame['something'].dtype == np.int64)
243+
self.frame['something'] = 2
244+
self.assert_(self.frame['something'].dtype == np.int64)
245+
self.frame['something'] = 2.5
246+
self.assert_(self.frame['something'].dtype == np.float64)
247+
225248
def test_setitem_boolean_column(self):
226249
expected = self.frame.copy()
227250
mask = self.frame['A'] > 0

0 commit comments

Comments
 (0)