@@ -127,6 +127,11 @@ class DateConversionError(Exception):
127
127
usecols : array-like
128
128
Return a subset of the columns.
129
129
Results in much faster parsing time and lower memory usage.
130
+ mangle_dup_columns: boolean, default True
131
+ Duplicate columns will be specified as 'X.0'...'X.N', rather than 'X'...'X'
132
+ multi_index_columns_compat: boolean, default False
133
+ Leave a list of tuples on columns as is (default is to convert to
134
+ a Multi Index on the columns)
130
135
131
136
Returns
132
137
-------
@@ -294,6 +299,7 @@ def _read(filepath_or_buffer, kwds):
294
299
'squeeze' : False ,
295
300
'compression' : None ,
296
301
'mangle_dupe_cols' : True ,
302
+ 'multi_index_columns_compat' :False ,
297
303
}
298
304
299
305
@@ -380,7 +386,8 @@ def parser_f(filepath_or_buffer,
380
386
verbose = False ,
381
387
encoding = None ,
382
388
squeeze = False ,
383
- mangle_dupe_cols = True
389
+ mangle_dupe_cols = True ,
390
+ multi_index_columns_compat = False ,
384
391
):
385
392
386
393
# Alias sep -> delimiter.
@@ -438,7 +445,7 @@ def parser_f(filepath_or_buffer,
438
445
error_bad_lines = error_bad_lines ,
439
446
low_memory = low_memory ,
440
447
buffer_lines = buffer_lines ,
441
- mangle_dupe_cols = mangle_dupe_cols
448
+ mangle_dupe_cols = mangle_dupe_cols ,
442
449
)
443
450
444
451
return _read (filepath_or_buffer , kwds )
@@ -730,6 +737,7 @@ def __init__(self, kwds):
730
737
self .na_values = kwds .get ('na_values' )
731
738
self .true_values = kwds .get ('true_values' )
732
739
self .false_values = kwds .get ('false_values' )
740
+ self .multi_index_columns_compat = kwds .get ('multi_index_columns_compat' ,False )
733
741
734
742
self ._date_conv = _make_date_converter (date_parser = self .date_parser ,
735
743
dayfirst = self .dayfirst )
@@ -786,7 +794,8 @@ def extract(r):
786
794
787
795
def _maybe_make_multi_index_columns (self , columns , col_names = None ):
788
796
# possibly create a column mi here
789
- if len (columns ) and not isinstance (columns , MultiIndex ) and all ([ isinstance (c ,tuple ) for c in columns ]):
797
+ if not self .multi_index_columns_compat and len (columns ) and not isinstance (
798
+ columns , MultiIndex ) and all ([ isinstance (c ,tuple ) for c in columns ]):
790
799
columns = MultiIndex .from_tuples (columns ,names = col_names )
791
800
return columns
792
801
@@ -1430,12 +1439,14 @@ def _infer_columns(self):
1430
1439
1431
1440
# we have a mi columns, so read and extra line
1432
1441
if isinstance (header ,(list ,tuple ,np .ndarray )):
1442
+ have_mi_columns = True
1433
1443
header = list (header ) + [header [- 1 ]+ 1 ]
1434
1444
else :
1445
+ have_mi_columns = False
1435
1446
header = [ header ]
1436
1447
1437
1448
columns = []
1438
- for hr in header :
1449
+ for level , hr in enumerate ( header ) :
1439
1450
1440
1451
if len (self .buf ) > 0 :
1441
1452
line = self .buf [0 ]
@@ -1448,7 +1459,10 @@ def _infer_columns(self):
1448
1459
this_columns = []
1449
1460
for i , c in enumerate (line ):
1450
1461
if c == '' :
1451
- this_columns .append ('Unnamed: %d' % i )
1462
+ if have_mi_columns :
1463
+ this_columns .append ('Unnamed: %d_level_%d' % (i ,level ))
1464
+ else :
1465
+ this_columns .append ('Unnamed: %d' % i )
1452
1466
else :
1453
1467
this_columns .append (c )
1454
1468
0 commit comments