Skip to content

Commit fee3444

Browse files
committed
Revise fix so it checks that header is non-negative integer (or list-like object of non-negative integers), or None
1 parent dfecd26 commit fee3444

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

pandas/io/common.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,6 @@ def _validate_header_arg(header) -> None:
125125
"the row(s) making up the column names"
126126
)
127127

128-
# In version 0.24, this would have worked.
129-
if header == -1:
130-
raise ValueError(
131-
"Passing -1 to header is invalid. For no header, use header=None instead"
132-
)
133-
134128

135129
def _stringify_path(
136130
filepath_or_buffer: FilePathOrBuffer[AnyStr]

pandas/io/parsers.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,10 @@ def __init__(self, kwds):
13931393
if isinstance(self.header, (list, tuple, np.ndarray)):
13941394
if not all(map(is_integer, self.header)):
13951395
raise ValueError("header must be integer or list of integers")
1396+
if any(i < 0 for i in self.header):
1397+
raise ValueError(
1398+
"cannot specify multi-index header with negative integers"
1399+
)
13961400
if kwds.get("usecols"):
13971401
raise ValueError(
13981402
"cannot specify usecols when specifying a multi-index header"
@@ -1419,6 +1423,13 @@ def __init__(self, kwds):
14191423
elif self.header is not None and not is_integer(self.header):
14201424
raise ValueError("header must be integer or list of integers")
14211425

1426+
# GH 27779
1427+
elif self.header is not None and self.header < 0:
1428+
raise ValueError(
1429+
"Passing negative integer to header is invalid. "
1430+
"For no header, use header=None instead"
1431+
)
1432+
14221433
self._name_processed = False
14231434

14241435
self._first_chunk = True

pandas/tests/io/parser/test_header.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,26 @@ def test_negative_header(all_parsers):
3333
"""
3434
with pytest.raises(
3535
ValueError,
36-
match="Passing -1 to header is invalid. "
36+
match="Passing negative integer to header is invalid. "
3737
"For no header, use header=None instead",
3838
):
3939
parser.read_csv(StringIO(data), header=-1)
4040

4141

42+
@pytest.mark.parametrize("header", [([-1, 2, 4]), ([-5, 0])])
43+
def test_negative_multi_index_header(all_parsers, header):
44+
# see gh-27779
45+
parser = all_parsers
46+
data = """1,2,3,4,5
47+
6,7,8,9,10
48+
11,12,13,14,15
49+
"""
50+
with pytest.raises(
51+
ValueError, match="cannot specify multi-index header with negative integers"
52+
):
53+
parser.read_csv(StringIO(data), header=header)
54+
55+
4256
@pytest.mark.parametrize("header", [True, False])
4357
def test_bool_header_arg(all_parsers, header):
4458
# see gh-6114

0 commit comments

Comments
 (0)