Skip to content

BUG: pd.DataFrame.from_records() raises a KeyError if passed a string index and an empty iterable #47319

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
2 changes: 1 addition & 1 deletion doc/source/whatsnew/v1.5.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,7 @@ Conversion
Strings
^^^^^^^
- Bug in :meth:`str.startswith` and :meth:`str.endswith` when using other series as parameter _pat_. Now raises ``TypeError`` (:issue:`3485`)
-
- Bug in :meth:`DataFrame.from_records` raises a ``KeyError`` if passed a string field label and an empty iterable (:issue:`47285`)

Interval
^^^^^^^^
Expand Down
8 changes: 8 additions & 0 deletions pandas/core/frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -2291,6 +2291,14 @@ def maybe_reorder(
arr_columns = ensure_index(arr_columns)
if columns is None:
columns = arr_columns

if len(arrays) == 0:
if index is not None:
if isinstance(index, str) or not hasattr(index, "__iter__"):
if index not in columns:
result_index = [index]
index = None

else:
arrays, arr_columns, result_index = maybe_reorder(
arrays, arr_columns, columns, index
Expand Down
16 changes: 16 additions & 0 deletions pandas/tests/io/formats/test_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -491,3 +491,19 @@ def test_info_int_columns():
"""
)
assert result == expected


def test_info_from_rec():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please add the test we discussed where the behavior changed initially?

Also pre-commit is failing

Copy link
Author

@Kelvingandhi Kelvingandhi Jun 24, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After our discussion, I fixed that issue and also added that test in test_info.py (please check lines 502-509) plus in that test case, I made correction as well suggested by @simonjayhawkins (#47319 (comment)).

Furthermore, I already have initial test case included as well (lines 498-500).

I'm unsure what else is required.

On pre-commit failure, I'm beginner here and not sure what causing it to fail (when last time it passed for earlier commits). Any help to get this resolved would be appreciated.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sorry, missed that. Could you split that into two tests? Since technically they are testing different things.

You can run pre-commit locally and check the log. This should show the errors

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay. I will do that. Thank you for the response.

# GH47285
df = DataFrame.from_records([], index="foo")
buf = StringIO()
df.info(buf=buf)

itr = [
{"col_1": 3, "col_2": "a"},
{"col_1": 2, "col_2": "b"},
{"col_1": 1, "col_2": "c"},
{"col_1": 0, "col_2": "d"},
]
with pytest.raises(KeyError, match="^'col_14'$"):
df = DataFrame.from_records(itr, index="col_14")