From 7d0fac97c9da5faa781a704fe34cf47d0cf059f9 Mon Sep 17 00:00:00 2001 From: Dave hughes <2043653+dwhu@users.noreply.github.com> Date: Thu, 2 Jan 2020 12:00:10 -0800 Subject: [PATCH 1/3] TST: Adding test to concat where copy=False for ExtensionArrays The test ensures that ExtensionArrays are correctly constructed when concat(copy=False) is used. --- pandas/tests/reshape/test_concat.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pandas/tests/reshape/test_concat.py b/pandas/tests/reshape/test_concat.py index 05193c00f0649..b2ee6f9cf1094 100644 --- a/pandas/tests/reshape/test_concat.py +++ b/pandas/tests/reshape/test_concat.py @@ -2730,3 +2730,25 @@ def test_concat_datetimeindex_freq(): expected = pd.DataFrame(data[50:] + data[:50], index=dr[50:].append(dr[:50])) expected.index._data.freq = None tm.assert_frame_equal(result, expected) + + +def test_concat_copy_false_extension_array(): + # GH 20756 + range_arr = list(range(8)) + dec_arr = to_decimal(range_arr) + df1 = pd.DataFrame({"int1": [1, 2, 3], "key1": [0, 1, 2], "ext1": dec_arr[:3]}) + df2 = pd.DataFrame( + {"int2": [1, 2, 3, 4], "key2": [0, 0, 1, 3], "ext2": dec_arr[3:7]} + ) + expected = pd.DataFrame( + { + "int1": [1, 2, 3, float("nan")], + "key1": [0, 1, 2, float("nan")], + "ext1": to_decimal(range_arr[:3] + ["nan"]), + "int2": [1, 2, 3, 4], + "key2": [0, 0, 1, 3], + "ext2": dec_arr[3:7], + } + ) + result = pd.concat([df1, df2], axis=1, copy=False) + tm.assert_frame_equal(result, expected) From 89311ab754a38e81f4334e1b5c1acc9dd9c9203f Mon Sep 17 00:00:00 2001 From: Dave hughes <2043653+dwhu@users.noreply.github.com> Date: Thu, 2 Jan 2020 12:57:54 -0800 Subject: [PATCH 2/3] TST: Moving test from test_concat.py to reshaping.py Also simplifying the test case to make it more understandable. --- pandas/tests/extension/base/reshaping.py | 13 +++++++++++++ pandas/tests/reshape/test_concat.py | 22 ---------------------- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/pandas/tests/extension/base/reshaping.py b/pandas/tests/extension/base/reshaping.py index 89c9ed3674a66..1a33de75df99b 100644 --- a/pandas/tests/extension/base/reshaping.py +++ b/pandas/tests/extension/base/reshaping.py @@ -94,6 +94,19 @@ def test_concat_columns(self, data, na_value): result = pd.concat([df1["A"], df2["B"]], axis=1) self.assert_frame_equal(result, expected) + # non-aligned + # copy=False + # GH 20756 + df2 = pd.DataFrame({"B": data[3:7]}) + expected = pd.DataFrame( + { + "A": data._from_sequence(list(data[:3]) + [na_value], dtype=data.dtype), + "B": data[3:7], + } + ) + result = pd.concat([df1, df2], axis=1, copy=False) + self.assert_frame_equal(result, expected) + def test_align(self, data, na_value): a = data[:3] b = data[2:5] diff --git a/pandas/tests/reshape/test_concat.py b/pandas/tests/reshape/test_concat.py index b2ee6f9cf1094..05193c00f0649 100644 --- a/pandas/tests/reshape/test_concat.py +++ b/pandas/tests/reshape/test_concat.py @@ -2730,25 +2730,3 @@ def test_concat_datetimeindex_freq(): expected = pd.DataFrame(data[50:] + data[:50], index=dr[50:].append(dr[:50])) expected.index._data.freq = None tm.assert_frame_equal(result, expected) - - -def test_concat_copy_false_extension_array(): - # GH 20756 - range_arr = list(range(8)) - dec_arr = to_decimal(range_arr) - df1 = pd.DataFrame({"int1": [1, 2, 3], "key1": [0, 1, 2], "ext1": dec_arr[:3]}) - df2 = pd.DataFrame( - {"int2": [1, 2, 3, 4], "key2": [0, 0, 1, 3], "ext2": dec_arr[3:7]} - ) - expected = pd.DataFrame( - { - "int1": [1, 2, 3, float("nan")], - "key1": [0, 1, 2, float("nan")], - "ext1": to_decimal(range_arr[:3] + ["nan"]), - "int2": [1, 2, 3, 4], - "key2": [0, 0, 1, 3], - "ext2": dec_arr[3:7], - } - ) - result = pd.concat([df1, df2], axis=1, copy=False) - tm.assert_frame_equal(result, expected) From 95bfa5045fc2a8136523887ff59aca191c1230d0 Mon Sep 17 00:00:00 2001 From: Dave hughes <2043653+dwhu@users.noreply.github.com> Date: Fri, 3 Jan 2020 09:37:55 -0800 Subject: [PATCH 3/3] TST: Moving test concat on copy=False for EA to own test. Per the feedback from PR #30625 --- pandas/tests/extension/base/reshaping.py | 4 ++-- pandas/tests/extension/test_sparse.py | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pandas/tests/extension/base/reshaping.py b/pandas/tests/extension/base/reshaping.py index 1a33de75df99b..ec21898852888 100644 --- a/pandas/tests/extension/base/reshaping.py +++ b/pandas/tests/extension/base/reshaping.py @@ -94,9 +94,9 @@ def test_concat_columns(self, data, na_value): result = pd.concat([df1["A"], df2["B"]], axis=1) self.assert_frame_equal(result, expected) - # non-aligned - # copy=False + def test_concat_extension_arrays_copy_false(self, data, na_value): # GH 20756 + df1 = pd.DataFrame({"A": data[:3]}) df2 = pd.DataFrame({"B": data[3:7]}) expected = pd.DataFrame( { diff --git a/pandas/tests/extension/test_sparse.py b/pandas/tests/extension/test_sparse.py index 6ebe71e173ec2..854bb8adcb100 100644 --- a/pandas/tests/extension/test_sparse.py +++ b/pandas/tests/extension/test_sparse.py @@ -132,6 +132,10 @@ def test_concat_columns(self, data, na_value): self._check_unsupported(data) super().test_concat_columns(data, na_value) + def test_concat_extension_arrays_copy_false(self, data, na_value): + self._check_unsupported(data) + super().test_concat_extension_arrays_copy_false(data, na_value) + def test_align(self, data, na_value): self._check_unsupported(data) super().test_align(data, na_value)