def att_dtype(column, types, info): for np_type in types: if column.min() > info(np_type).min and column.max() < info(np_type).max: column = column.astype(np_type) return column def reduce_mem_usage(column, verbose=True): col_type = str(column.dtype) if 'int' in col_type: np_int = [np.int8, np.int16, np.int32, np.int64][::-1] info = np.iinfo att_column = att_dtype(column, np_int, info) elif 'float' in col_type: np_float = [np.float16, np.float32, np.float64][::-1] info = np.finfo att_column = att_dtype(column, np_float, info) if verbose: start_mem = column.memory_usage() / 1024**2 end_mem = att_column.memory_usage() / 1024**2 reduction = 100 * (start_mem - end_mem) / start_mem print(f'Column {column.name} to type {str(att_column.dtype)} with {reduction}% reduction') return att_column df = df.apply(reduce_mem_usage, axis = 1) df.dtypes