Skip to content

Commit 0ab4b59

Browse files
meeseeksmachinegfyoung
authored andcommitted
Backport PR #27878: TST: Raise ValueError and suggestion to use header=None if header=-1 is pa… (#27938)
1 parent 7bd91e8 commit 0ab4b59

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

doc/source/whatsnew/v0.25.1.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ I/O
105105
^^^
106106

107107
- Avoid calling ``S3File.s3`` when reading parquet, as this was removed in s3fs version 0.3.0 (:issue:`27756`)
108-
-
108+
- Better error message when a negative header is passed in :func:`pandas.read_csv` (:issue:`27779`)
109109
-
110110

111111
Plotting

pandas/io/parsers.py

+11
Original file line numberDiff line numberDiff line change
@@ -1401,6 +1401,10 @@ def __init__(self, kwds):
14011401
if isinstance(self.header, (list, tuple, np.ndarray)):
14021402
if not all(map(is_integer, self.header)):
14031403
raise ValueError("header must be integer or list of integers")
1404+
if any(i < 0 for i in self.header):
1405+
raise ValueError(
1406+
"cannot specify multi-index header with negative integers"
1407+
)
14041408
if kwds.get("usecols"):
14051409
raise ValueError(
14061410
"cannot specify usecols when " "specifying a multi-index header"
@@ -1427,6 +1431,13 @@ def __init__(self, kwds):
14271431
elif self.header is not None and not is_integer(self.header):
14281432
raise ValueError("header must be integer or list of integers")
14291433

1434+
# GH 27779
1435+
elif self.header is not None and self.header < 0:
1436+
raise ValueError(
1437+
"Passing negative integer to header is invalid. "
1438+
"For no header, use header=None instead"
1439+
)
1440+
14301441
self._name_processed = False
14311442

14321443
self._first_chunk = True

pandas/tests/io/parser/test_header.py

+29
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,35 @@ def test_read_with_bad_header(all_parsers):
2424
parser.read_csv(s, header=[10])
2525

2626

27+
def test_negative_header(all_parsers):
28+
# see gh-27779
29+
parser = all_parsers
30+
data = """1,2,3,4,5
31+
6,7,8,9,10
32+
11,12,13,14,15
33+
"""
34+
with pytest.raises(
35+
ValueError,
36+
match="Passing negative integer to header is invalid. "
37+
"For no header, use header=None instead",
38+
):
39+
parser.read_csv(StringIO(data), header=-1)
40+
41+
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+
2756
@pytest.mark.parametrize("header", [True, False])
2857
def test_bool_header_arg(all_parsers, header):
2958
# see gh-6114

0 commit comments

Comments
 (0)