From 06e695469130a4fb4d7f6abbe7cbe861631d6b26 Mon Sep 17 00:00:00 2001 From: Lonercode Date: Fri, 7 Nov 2025 18:56:37 +0100 Subject: [PATCH 1/5] BUG: fix for pd.json_normalize on non string keys --- pandas/io/json/_normalize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/json/_normalize.py b/pandas/io/json/_normalize.py index 6194e699c12a8..b9162366bc68b 100644 --- a/pandas/io/json/_normalize.py +++ b/pandas/io/json/_normalize.py @@ -552,7 +552,7 @@ def _pull_records(js: dict[str, Any], spec: list | str) -> list: lengths = [] meta_vals: DefaultDict = defaultdict(list) - meta_keys = [sep.join(val) for val in _meta] + meta_keys = [sep.join(map(str, val)) for val in _meta] def _recursive_extract(data, path, seen_meta, level: int = 0) -> None: if isinstance(data, dict): From 04ff50e57c2b409aead1da66334ede21fcf627cd Mon Sep 17 00:00:00 2001 From: Lonercode Date: Mon, 10 Nov 2025 21:39:34 +0100 Subject: [PATCH 2/5] add test to test_normalize.py --- pandas/tests/io/json/test_normalize.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pandas/tests/io/json/test_normalize.py b/pandas/tests/io/json/test_normalize.py index f03fd235fef85..65968976b4360 100644 --- a/pandas/tests/io/json/test_normalize.py +++ b/pandas/tests/io/json/test_normalize.py @@ -927,3 +927,14 @@ def test_series_non_zero_index(self): index=[1, 2, 3], ) tm.assert_frame_equal(result, expected) + + def test_json_normalize_non_str_keys(self): + # Test that json_normalize handles non-string meta + # keys correctly when record_path is used + + data_list = [{"a": 1, 12: "meta_value", "nested": [{"b": 2}]}] + + result = json_normalize(data_list, record_path=["nested"], meta=[12]) + expected = DataFrame({"b": [2], 12: ["meta_value"]}) + + tm.assert_frame_equal(result, expected) From 5c7efa726a0deef600b4a8cae707aa13726b0a5e Mon Sep 17 00:00:00 2001 From: Lonercode Date: Mon, 10 Nov 2025 22:03:53 +0100 Subject: [PATCH 3/5] add test to test_normalize.py --- pandas/tests/io/json/test_normalize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/io/json/test_normalize.py b/pandas/tests/io/json/test_normalize.py index 65968976b4360..4dc81691e7ac2 100644 --- a/pandas/tests/io/json/test_normalize.py +++ b/pandas/tests/io/json/test_normalize.py @@ -935,6 +935,6 @@ def test_json_normalize_non_str_keys(self): data_list = [{"a": 1, 12: "meta_value", "nested": [{"b": 2}]}] result = json_normalize(data_list, record_path=["nested"], meta=[12]) - expected = DataFrame({"b": [2], 12: ["meta_value"]}) + expected = DataFrame({"b": [2], "12": ["meta_value"]}) tm.assert_frame_equal(result, expected) From 82838dbb5f56bf5985bb2891ff529ef6f2126be4 Mon Sep 17 00:00:00 2001 From: Lonercode Date: Wed, 12 Nov 2025 21:48:08 +0100 Subject: [PATCH 4/5] chore: fix name in test function --- pandas/tests/io/json/test_normalize.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pandas/tests/io/json/test_normalize.py b/pandas/tests/io/json/test_normalize.py index 4dc81691e7ac2..a354d634d9f10 100644 --- a/pandas/tests/io/json/test_normalize.py +++ b/pandas/tests/io/json/test_normalize.py @@ -929,12 +929,11 @@ def test_series_non_zero_index(self): tm.assert_frame_equal(result, expected) def test_json_normalize_non_str_keys(self): + # see gh-63019 # Test that json_normalize handles non-string meta # keys correctly when record_path is used - data_list = [{"a": 1, 12: "meta_value", "nested": [{"b": 2}]}] - - result = json_normalize(data_list, record_path=["nested"], meta=[12]) + data = [{"a": 1, 12: "meta_value", "nested": [{"b": 2}]}] + result = json_normalize(data, record_path=["nested"], meta=[12]) expected = DataFrame({"b": [2], "12": ["meta_value"]}) - tm.assert_frame_equal(result, expected) From 73e266d30300432b5b8e28ade4eba2a69cd5ccf1 Mon Sep 17 00:00:00 2001 From: Lonercode Date: Wed, 12 Nov 2025 22:20:13 +0100 Subject: [PATCH 5/5] chore: fix name in test function --- pandas/tests/io/json/test_normalize.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandas/tests/io/json/test_normalize.py b/pandas/tests/io/json/test_normalize.py index a354d634d9f10..425dfca35f7bc 100644 --- a/pandas/tests/io/json/test_normalize.py +++ b/pandas/tests/io/json/test_normalize.py @@ -934,6 +934,8 @@ def test_json_normalize_non_str_keys(self): # keys correctly when record_path is used data = [{"a": 1, 12: "meta_value", "nested": [{"b": 2}]}] + result = json_normalize(data, record_path=["nested"], meta=[12]) expected = DataFrame({"b": [2], "12": ["meta_value"]}) + tm.assert_frame_equal(result, expected)