Skip to content

Commit 5e62a26

Browse files
committed
ENH: DataFrame.convert_objects for inferring better dtypes, GH #302
1 parent 53ff161 commit 5e62a26

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

RELEASE.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ pandas 0.6.1
5050
- Implement Series.rank and DataFrame.rank, fast versions of
5151
scipy.stats.rankdata (GH #428)
5252
- Implement DataFrame.from_items alternate constructor (GH #444)
53+
- DataFrame.convert_objects method for inferring better dtypes for object
54+
columns (GH #302)
5355

5456
**Improvements to existing features**
5557

pandas/core/frame.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,25 @@ def info(self, verbose=True, buf=None):
861861
def dtypes(self):
862862
return self.apply(lambda x: x.dtype)
863863

864+
def convert_objects(self):
865+
"""
866+
Attempt to infer better dtype for object columns
867+
868+
Returns
869+
-------
870+
converted : DataFrame
871+
"""
872+
new_data = {}
873+
874+
# TODO: could be more efficient taking advantage of the block
875+
for col, s in self.iteritems():
876+
if s.dtype == np.object_:
877+
new_data[col] = lib.maybe_convert_objects(s)
878+
else:
879+
new_data[col] = s
880+
881+
return DataFrame(new_data, index=self.index, columns=self.columns)
882+
864883
def get_dtype_counts(self):
865884
counts = {}
866885
for _, series in self.iterkv():

pandas/tests/test_frame.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2004,6 +2004,12 @@ def test_dtypes(self):
20042004
index=result.index)
20052005
assert_series_equal(result, expected)
20062006

2007+
def test_convert_objects(self):
2008+
oops = self.mixed_frame.T.T
2009+
converted = oops.convert_objects()
2010+
assert_frame_equal(converted, self.mixed_frame)
2011+
self.assert_(converted['A'].dtype == np.float64)
2012+
20072013
def test_append(self):
20082014
begin_index = self.frame.index[:5]
20092015
end_index = self.frame.index[5:]

0 commit comments

Comments
 (0)