Skip to content

Commit a796280

Browse files
committed
Only allow for sparse merging if everything is sparse
1 parent d24e464 commit a796280

File tree

2 files changed

+25
-17
lines changed

2 files changed

+25
-17
lines changed

pandas/core/internals.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5147,7 +5147,7 @@ def concatenate_block_managers(mgrs_indexers, axes, concat_axis, copy):
51475147

51485148

51495149
def is_sparse_join_units(join_units):
5150-
return any(type(ju.block) is SparseBlock for ju in join_units)
5150+
return all(type(ju.block) is SparseBlock for ju in join_units)
51515151

51525152

51535153
def is_uniform_join_units(join_units):

pandas/tests/reshape/merge/test_merge.py

+24-16
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
is_categorical_dtype,
2020
is_object_dtype,
2121
)
22-
from pandas import DataFrame, Index, MultiIndex, Series, Categorical
22+
from pandas import (
23+
DataFrame, Index,
24+
MultiIndex, Series, Categorical
25+
)
2326
import pandas.util.testing as tm
2427
from pandas.api.types import CategoricalDtype as CDT
2528

@@ -1845,7 +1848,7 @@ def test_merge_two_sparse_frames(self, fill_value, how):
18451848
tm.assert_almost_equal(sparse_merge.default_fill_value,
18461849
fill_value)
18471850

1848-
exp = dense_merge.to_sparse(fill_value=fill_value),
1851+
exp = dense_merge.to_sparse(fill_value=fill_value)
18491852
tm.assert_sp_frame_equal(sparse_merge, exp,
18501853
exact_indices=False,
18511854
check_dtype=False)
@@ -1869,22 +1872,27 @@ def test_merge_dense_sparse_frames(self, fill_value, how):
18691872
dense_threes = pd.DataFrame({'A': list(range(0, 300, 3)),
18701873
'B': np.random.randint(0, 100, size=100)})
18711874

1872-
dense_merge = dense_evens.merge(dense_threes, how=how, on='A')
1875+
sparse_evens = dense_evens.to_sparse(fill_value=fill_value)
18731876

1874-
# If you merge two dense frames together it tends to default to
1875-
# float64 not the original dtype
1876-
dense_merge['B_x'] = dense_merge['B_x'].astype(np.int64,
1877-
errors='ignore')
1878-
dense_merge['B_y'] = dense_merge['B_y'].astype(np.int64,
1879-
errors='ignore')
1877+
to_merge = [sparse_evens, dense_threes]
1878+
to_merge_dense = [dense_evens, dense_threes]
18801879

1881-
sparse_evens = dense_evens.to_sparse(fill_value=fill_value)
1882-
# sparse_threes = dense_threes.to_sparse(fill_value=fill_value)
1880+
for _ in range(2):
1881+
merged = to_merge[0].merge(to_merge[1], how=how, on='A')
1882+
# sparse_merge = sparse_evens.merge(dense_threes, how=how, on='A')
18831883

1884-
sparse_merge = sparse_evens.merge(dense_threes, how=how, on='A')
1884+
dense_merge = to_merge_dense[0].merge(to_merge_dense[1],
1885+
how=how, on='A')
18851886

1886-
tm.assert_almost_equal(sparse_merge.default_fill_value, fill_value)
1887+
# If you merge two dense frames together it tends to default to
1888+
# float64 not the original dtype
1889+
dense_merge['B_x'] = dense_merge['B_x'].astype(np.int64,
1890+
errors='ignore')
1891+
dense_merge['B_y'] = dense_merge['B_y'].astype(np.int64,
1892+
errors='ignore')
1893+
for column in dense_merge.columns:
1894+
dense_col = merged[column].to_dense()
1895+
tm.assert_series_equal(dense_col, dense_merge[column])
18871896

1888-
tm.assert_sp_frame_equal(dense_merge.to_sparse(fill_value=fill_value),
1889-
sparse_merge, exact_indices=False,
1890-
check_dtype=False)
1897+
to_merge = to_merge[::-1]
1898+
to_merge_dense = to_merge_dense[::-1]

0 commit comments

Comments
 (0)