Skip to content

Commit 1156645

Browse files
Carter GreenCarter Green
Carter Green
authored and
Carter Green
committed
BUG: #7757 Fix CSV parsing of singleton list header
Write test for header with len 1 that fails Fix header list manipulation causing problems with singleton lists
1 parent f9a552d commit 1156645

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

pandas/_libs/parsers.pyx

+19-12
Original file line numberDiff line numberDiff line change
@@ -535,18 +535,25 @@ cdef class TextReader:
535535
self.parser_start = 0
536536
self.header = []
537537
else:
538-
if isinstance(header, list) and len(header):
539-
# need to artifically skip the final line
540-
# which is still a header line
541-
header = list(header)
542-
header.append(header[-1] + 1)
543-
544-
self.parser.header_start = header[0]
545-
self.parser.header_end = header[-1]
546-
self.parser.header = header[0]
547-
self.parser_start = header[-1] + 1
548-
self.has_mi_columns = 1
549-
self.header = header
538+
if isinstance(header, list):
539+
if len(header) > 1:
540+
# need to artifically skip the final line
541+
# which is still a header line
542+
header = list(header)
543+
header.append(header[-1] + 1)
544+
545+
self.parser.header_start = header[0]
546+
self.parser.header_end = header[-1]
547+
self.parser.header = header[0]
548+
self.parser_start = header[-1] + 1
549+
self.has_mi_columns = 1
550+
self.header = header
551+
else:
552+
self.parser.header_start = header[0]
553+
self.parser.header_end = header[0]
554+
self.parser.header = header[0]
555+
self.parser_start = header[0] + 1
556+
self.header = header
550557
else:
551558
self.parser.header_start = header
552559
self.parser.header_end = header

pandas/io/parsers.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -2281,8 +2281,12 @@ def _infer_columns(self):
22812281

22822282
# we have a mi columns, so read an extra line
22832283
if isinstance(header, (list, tuple, np.ndarray)):
2284-
have_mi_columns = True
2285-
header = list(header) + [header[-1] + 1]
2284+
if len(header) > 1:
2285+
have_mi_columns = True
2286+
header = list(header) + [header[-1] + 1]
2287+
# Don't add second element to header if it's of length 1
2288+
else:
2289+
have_mi_columns = False
22862290
else:
22872291
have_mi_columns = False
22882292
header = [header]

pandas/tests/io/parser/header.py

+7
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,10 @@ def test_non_int_header(self):
286286
self.read_csv(StringIO(data), sep=',', header=['a', 'b'])
287287
with tm.assert_raises_regex(ValueError, msg):
288288
self.read_csv(StringIO(data), sep=',', header='string_header')
289+
290+
def test_singleton_header(self):
291+
# See GH #7757
292+
data = """a,b,c\n0,1,2\n1,2,3"""
293+
df = self.read_csv(StringIO(data), header=[0])
294+
expected = self.read_csv(StringIO(data), header=0)
295+
tm.assert_frame_equal(df, expected)

0 commit comments

Comments
 (0)