Skip to content

Commit 4cbed72

Browse files
joshamPingviinituutti
authored andcommitted
BUG: fixed merging with empty frame containing an Int64 column (pandas-dev#25183) (pandas-dev#25289)
1 parent 2c49951 commit 4cbed72

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

doc/source/whatsnew/v0.24.2.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ Bug Fixes
9696
**Other**
9797

9898
- Bug in :meth:`Series.is_unique` where single occurrences of ``NaN`` were not considered unique (:issue:`25180`)
99-
-
99+
- Bug in :func:`merge` when merging an empty ``DataFrame`` with an ``Int64`` column or a non-empty ``DataFrame`` with an ``Int64`` column that is all ``NaN`` (:issue:`25183`)
100100
-
101101

102102
.. _whatsnew_0.242.contributors:

pandas/core/internals/concat.py

+2
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ def get_reindexed_values(self, empty_dtype, upcasted_na):
190190
pass
191191
elif getattr(self.block, 'is_sparse', False):
192192
pass
193+
elif getattr(self.block, 'is_extension', False):
194+
pass
193195
else:
194196
missing_arr = np.empty(self.shape, dtype=empty_dtype)
195197
missing_arr.fill(fill_value)

pandas/tests/reshape/merge/test_merge.py

+78
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,54 @@ def get_test_data(ngroups=NGROUPS, n=N):
3939
return arr
4040

4141

42+
def get_series():
43+
return [
44+
pd.Series([1], dtype='int64'),
45+
pd.Series([1], dtype='Int64'),
46+
pd.Series([1.23]),
47+
pd.Series(['foo']),
48+
pd.Series([True]),
49+
pd.Series([pd.Timestamp('2018-01-01')]),
50+
pd.Series([pd.Timestamp('2018-01-01', tz='US/Eastern')]),
51+
]
52+
53+
54+
def get_series_na():
55+
return [
56+
pd.Series([np.nan], dtype='Int64'),
57+
pd.Series([np.nan], dtype='float'),
58+
pd.Series([np.nan], dtype='object'),
59+
pd.Series([pd.NaT]),
60+
]
61+
62+
63+
@pytest.fixture(params=get_series(), ids=lambda x: x.dtype.name)
64+
def series_of_dtype(request):
65+
"""
66+
A parametrized fixture returning a variety of Series of different
67+
dtypes
68+
"""
69+
return request.param
70+
71+
72+
@pytest.fixture(params=get_series(), ids=lambda x: x.dtype.name)
73+
def series_of_dtype2(request):
74+
"""
75+
A duplicate of the series_of_dtype fixture, so that it can be used
76+
twice by a single function
77+
"""
78+
return request.param
79+
80+
81+
@pytest.fixture(params=get_series_na(), ids=lambda x: x.dtype.name)
82+
def series_of_dtype_all_na(request):
83+
"""
84+
A parametrized fixture returning a variety of Series with all NA
85+
values
86+
"""
87+
return request.param
88+
89+
4290
class TestMerge(object):
4391

4492
def setup_method(self, method):
@@ -428,6 +476,36 @@ def check2(exp, kwarg):
428476
check1(exp_in, kwarg)
429477
check2(exp_out, kwarg)
430478

479+
def test_merge_empty_frame(self, series_of_dtype, series_of_dtype2):
480+
# GH 25183
481+
df = pd.DataFrame({'key': series_of_dtype, 'value': series_of_dtype2},
482+
columns=['key', 'value'])
483+
df_empty = df[:0]
484+
expected = pd.DataFrame({
485+
'value_x': pd.Series(dtype=df.dtypes['value']),
486+
'key': pd.Series(dtype=df.dtypes['key']),
487+
'value_y': pd.Series(dtype=df.dtypes['value']),
488+
}, columns=['value_x', 'key', 'value_y'])
489+
actual = df_empty.merge(df, on='key')
490+
assert_frame_equal(actual, expected)
491+
492+
def test_merge_all_na_column(self, series_of_dtype,
493+
series_of_dtype_all_na):
494+
# GH 25183
495+
df_left = pd.DataFrame(
496+
{'key': series_of_dtype, 'value': series_of_dtype_all_na},
497+
columns=['key', 'value'])
498+
df_right = pd.DataFrame(
499+
{'key': series_of_dtype, 'value': series_of_dtype_all_na},
500+
columns=['key', 'value'])
501+
expected = pd.DataFrame({
502+
'key': series_of_dtype,
503+
'value_x': series_of_dtype_all_na,
504+
'value_y': series_of_dtype_all_na,
505+
}, columns=['key', 'value_x', 'value_y'])
506+
actual = df_left.merge(df_right, on='key')
507+
assert_frame_equal(actual, expected)
508+
431509
def test_merge_nosort(self):
432510
# #2098, anything to do?
433511

0 commit comments

Comments
 (0)