|
1 | 1 | import numpy as np
|
2 |
| - |
3 |
| -import pandas.util._test_decorators as td |
| 2 | +import pytest |
4 | 3 |
|
5 | 4 | from pandas import (
|
6 | 5 | DataFrame,
|
@@ -182,19 +181,25 @@ def test_concat_mixed_series_frame(using_copy_on_write):
|
182 | 181 | tm.assert_frame_equal(result, expected)
|
183 | 182 |
|
184 | 183 |
|
185 |
| -@td.skip_copy_on_write_not_yet_implemented # TODO(CoW) |
186 |
| -def test_merge_on_key(using_copy_on_write): |
| 184 | +@pytest.mark.parametrize( |
| 185 | + "func", |
| 186 | + [ |
| 187 | + lambda df1, df2, **kwargs: df1.merge(df2, **kwargs), |
| 188 | + lambda df1, df2, **kwargs: merge(df1, df2, **kwargs), |
| 189 | + ], |
| 190 | +) |
| 191 | +def test_merge_on_key(using_copy_on_write, func): |
187 | 192 | df1 = DataFrame({"key": ["a", "b", "c"], "a": [1, 2, 3]})
|
188 | 193 | df2 = DataFrame({"key": ["a", "b", "c"], "b": [4, 5, 6]})
|
189 | 194 | df1_orig = df1.copy()
|
190 | 195 | df2_orig = df2.copy()
|
191 | 196 |
|
192 |
| - result = merge(df1, df2, on="key") |
| 197 | + result = func(df1, df2, on="key") |
193 | 198 |
|
194 | 199 | if using_copy_on_write:
|
195 | 200 | assert np.shares_memory(get_array(result, "a"), get_array(df1, "a"))
|
196 | 201 | assert np.shares_memory(get_array(result, "b"), get_array(df2, "b"))
|
197 |
| - assert not np.shares_memory(get_array(result, "key"), get_array(df1, "key")) |
| 202 | + assert np.shares_memory(get_array(result, "key"), get_array(df1, "key")) |
198 | 203 | assert not np.shares_memory(get_array(result, "key"), get_array(df2, "key"))
|
199 | 204 | else:
|
200 | 205 | assert not np.shares_memory(get_array(result, "a"), get_array(df1, "a"))
|
@@ -239,4 +244,39 @@ def test_merge_on_index(using_copy_on_write):
|
239 | 244 | tm.assert_frame_equal(df2, df2_orig)
|
240 | 245 |
|
241 | 246 |
|
242 |
| -# TODO(CoW) add merge tests where one of left/right isn't copied |
| 247 | +@pytest.mark.parametrize( |
| 248 | + "func, how", |
| 249 | + [ |
| 250 | + (lambda df1, df2, **kwargs: merge(df2, df1, on="key", **kwargs), "right"), |
| 251 | + (lambda df1, df2, **kwargs: merge(df1, df2, on="key", **kwargs), "left"), |
| 252 | + ], |
| 253 | +) |
| 254 | +def test_merge_on_key_enlarging_one(using_copy_on_write, func, how): |
| 255 | + df1 = DataFrame({"key": ["a", "b", "c"], "a": [1, 2, 3]}) |
| 256 | + df2 = DataFrame({"key": ["a", "b"], "b": [4, 5]}) |
| 257 | + df1_orig = df1.copy() |
| 258 | + df2_orig = df2.copy() |
| 259 | + |
| 260 | + result = func(df1, df2, how=how) |
| 261 | + |
| 262 | + if using_copy_on_write: |
| 263 | + assert np.shares_memory(get_array(result, "a"), get_array(df1, "a")) |
| 264 | + assert not np.shares_memory(get_array(result, "b"), get_array(df2, "b")) |
| 265 | + assert df2._mgr._has_no_reference(1) |
| 266 | + assert df2._mgr._has_no_reference(0) |
| 267 | + assert np.shares_memory(get_array(result, "key"), get_array(df1, "key")) is ( |
| 268 | + how == "left" |
| 269 | + ) |
| 270 | + assert not np.shares_memory(get_array(result, "key"), get_array(df2, "key")) |
| 271 | + else: |
| 272 | + assert not np.shares_memory(get_array(result, "a"), get_array(df1, "a")) |
| 273 | + assert not np.shares_memory(get_array(result, "b"), get_array(df2, "b")) |
| 274 | + |
| 275 | + if how == "left": |
| 276 | + result.iloc[0, 1] = 0 |
| 277 | + else: |
| 278 | + result.iloc[0, 2] = 0 |
| 279 | + if using_copy_on_write: |
| 280 | + assert not np.shares_memory(get_array(result, "a"), get_array(df1, "a")) |
| 281 | + tm.assert_frame_equal(df1, df1_orig) |
| 282 | + tm.assert_frame_equal(df2, df2_orig) |
0 commit comments