@@ -847,13 +847,15 @@ def get_chunk(self, rows=None):
847
847
if self .parse_dates is not None :
848
848
data , columns = self ._process_date_conversion (data )
849
849
850
- # apply converters
850
+ #converters to column names
851
+ clean_conv = {}
851
852
for col , f in self .converters .iteritems ():
852
853
if isinstance (col , int ) and col not in self .orig_columns :
853
854
col = self .orig_columns [col ]
854
- data [col ] = lib . map_infer ( data [ col ], f )
855
+ clean_conv [col ] = f
855
856
856
- data = _convert_to_ndarrays (data , self .na_values , self .verbose )
857
+ data = _convert_to_ndarrays (data , self .na_values , self .verbose ,
858
+ clean_conv )
857
859
858
860
if self .index_col is None :
859
861
numrows = len (content )
@@ -1141,18 +1143,23 @@ def _get_na_values(col, na_values):
1141
1143
return na_values
1142
1144
1143
1145
1144
- def _convert_to_ndarrays (dct , na_values , verbose = False ):
1146
+ def _convert_to_ndarrays (dct , na_values , verbose = False , converters = None ):
1145
1147
result = {}
1146
1148
for c , values in dct .iteritems ():
1149
+ conv_f = None if converters is None else converters .get (c , None )
1147
1150
col_na_values = _get_na_values (c , na_values )
1148
- cvals , na_count = _convert_types (values , col_na_values )
1151
+ coerce_type = True
1152
+ if conv_f is not None :
1153
+ values = lib .map_infer (values , conv_f )
1154
+ coerce_type = False
1155
+ cvals , na_count = _convert_types (values , col_na_values , coerce_type )
1149
1156
result [c ] = cvals
1150
1157
if verbose and na_count :
1151
1158
print 'Filled %d NA values in column %s' % (na_count , str (c ))
1152
1159
return result
1153
1160
1154
1161
1155
- def _convert_types (values , na_values ):
1162
+ def _convert_types (values , na_values , try_num_bool = True ):
1156
1163
na_count = 0
1157
1164
if issubclass (values .dtype .type , (np .number , np .bool_ )):
1158
1165
mask = lib .ismember (values , na_values )
@@ -1163,13 +1170,17 @@ def _convert_types(values, na_values):
1163
1170
np .putmask (values , mask , np .nan )
1164
1171
return values , na_count
1165
1172
1166
- try :
1167
- result = lib .maybe_convert_numeric (values , na_values , False )
1168
- except Exception :
1173
+ if try_num_bool :
1174
+ try :
1175
+ result = lib .maybe_convert_numeric (values , na_values , False )
1176
+ except Exception :
1177
+ na_count = lib .sanitize_objects (values , na_values , False )
1178
+ result = values
1179
+ else :
1169
1180
na_count = lib .sanitize_objects (values , na_values , False )
1170
1181
result = values
1171
1182
1172
- if result .dtype == np .object_ :
1183
+ if result .dtype == np .object_ and try_num_bool :
1173
1184
result = lib .maybe_convert_bool (values )
1174
1185
1175
1186
return result , na_count
@@ -1352,7 +1363,7 @@ def parse(self, sheetname, header=0, skiprows=None, skip_footer=0,
1352
1363
skip_footer = skip_footer )
1353
1364
1354
1365
def _should_parse (self , i , parse_cols ):
1355
-
1366
+
1356
1367
def _range2cols (areas ):
1357
1368
"""
1358
1369
Convert comma separated list of column names and column ranges to a
@@ -1363,10 +1374,10 @@ def _range2cols(areas):
1363
1374
>>> _range2cols('A,C,Z:AB')
1364
1375
[0, 2, 25, 26, 27]
1365
1376
"""
1366
- def _excel2num (x ):
1377
+ def _excel2num (x ):
1367
1378
"Convert Excel column name like 'AB' to 0-based column index"
1368
1379
return reduce (lambda s ,a : s * 26 + ord (a )- ord ('A' )+ 1 , x .upper ().strip (), 0 )- 1
1369
-
1380
+
1370
1381
cols = []
1371
1382
for rng in areas .split (',' ):
1372
1383
if ':' in rng :
0 commit comments